整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。
輸入每組輸入是兩個整數n和k。(1 <= n <= 50, 1 <= k <= n)
輸出對於輸入的 n,k;
1. 將n劃分成若干正整數之和的劃分數.
思路:設每乙個劃分數都不大於m
那麼有兩種情況 第一是至少有乙個m 則有f(n-m, m);
第二是每乙個劃分數都小於m 則有f(n, m-1)
綜上總的劃分數有 f(n, m) = f(n, m-1) + f(n-m, m);
當n == 0 || n == 1時不必再分, 當m == 1時,沒有比1更小的劃分數,不必再分
遞迴出口: n == 0 || n == 1 || m == 1 return 1;
當然遞迴效率不高,僅僅給出乙個解決的方案,高效率的可以使用動態規劃
#include
intfun
(int n,
int m)
intmain()
2. 將n劃分成k個正整數之和的劃分數。
3. 將n劃分成最大數不超過k的劃分數。
4.將n劃分成若干個 奇正整數之和的劃分數。
5. 將n劃分成若干不同整數之和的劃分數。
整數劃分問題
整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...
整數劃分問題
給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...
整數劃分問題
首先是遞迴解法 整數劃分問題是將乙個正整數n拆成一組數連加並等於n的形式,且這組數中的最大加數不大於n。如6的整數劃分為 65 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 2 2,2 2 1 1,2 1 1 1 1 1 1 1 1 1 1 共11種。下面介紹一種通過遞迴方法得到乙...