整數劃分問題(放蘋果問題)(遞迴)

2021-08-18 12:28:41 字數 1104 閱讀 6331

將正整數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劃分。這裡我們...