將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。
標準的輸入包含若干組測試資料。每組測試資料是乙個整數n(0 < n <= 50)。
對於每組測試資料,輸出n的劃分數。
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
遞迴,尋找遞迴公式,將問題抽象為把n個1放到不同個數的盒子裡。每個盒子裡1的個數就是這個盒子代表的數
首先我們用find(n,k)表示把n個1放到k個盒子裡的方法總數。
那麼我們有兩種放法,第一種是每個盒子都要放,那麼每個盒子都要放乙個,可以先將這k個放完,然後問題轉化為把n-k個1放到k個盒子裡的方法數,即find(n-k,k)
然後我們考慮至少有乙個盒子不放1的方法,那麼這個盒子可以直接去掉,即find(n,k-1)
所以一般來說,有遞迴公式find(n,k)=find(n-k,k)+find(n,k-1)
但是,我們如果有
n<
k n
<
k,則至少有k-n個盒子是空的,也就是方法數和find(n,n)一樣,即find(n,k)=find(n,n)
隨後是比較重要的邊界條件
如果k=1,那麼顯然只有一種放法,把所有的1都放進盒子中,即find(n,1)=1
如果n=0,那麼find(0,k)=1,這個式子的實際意義不明顯,但是通過兩個式子
find(2,2)=2 (2的分割有兩種)
find(2,2)=find(2,1)+find(0,2) (之前的遞迴公式)
find(2,1)=1 (之前的邊界條件)
所以,可以得到邊界條件find(0,k)=1
#include
int find(int a, int b)
if (b == 1)
if (a < b)
return find(a, b - 1) + find(a - b, b);
}int main()
return
0;}
簡單整數劃分與放蘋果問題思考(遞迴)
這兩個問題幾乎是相同的,但是以放蘋果的方式來思考問題明顯會更易理解。下面先看一下兩個問題的描述。整數劃分 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。分蘋...
放蘋果與整數劃分問題(by幻星總結)
放蘋果與整數劃分問題 by幻星總結 以下均假設 m n,對於m n 情況請程式設計時自己注意 設h m,n 表示m 個數分成 n分,允許某分為 0 設g m,n 表示m 個數分成 n分,不允許某分為 0 於是兩者關係為 h m,n g m n,n 下面給出兩種方法求 h m,n g m,n 關於自身...
整數劃分問題遞迴
整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們...