整數劃分問題(遞迴法 或 母函式法 )

2022-04-28 22:15:27 字數 2455 閱讀 6513

樣題:sdut2015寒假結訓賽

開始我還以為是用揹包來做,但是寫完了**,怎麼寫就是不對,並且在實現的時候確實有點地方我用揹包的演算法描述不了!

後來查到可以用:遞迴 或者 母函式演算法!

比賽時曾考慮過用遞迴來實現,但沒有推導出來,後來發現別人的部落格裡面寫著「整數劃分問題」應該在講解遞迴的時候就該學會了。

我的心裡頓時感到一股抱怨和悔恨,唉!當然自己的責任最大!

整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式:

n=m1+m2+...+mi; (其中mi為正整數,並且1 <= mi <= n),則為n的乙個劃分。

如果中的最大值不超過m,即max(m1,m2,...,mi)<=m,則稱它屬於n的乙個m劃分。這裡我們記n的m劃分的個數為f(n,m);

例如但n=4時,他有5個劃分,,,,,;

注意4=1+3 和 4=3+1被認為是同乙個劃分。

整數劃分是乙個非常經典的數學問題。

所謂整數劃分,是指把乙個正整數n寫成為n=m1+m2+...+mi的形式,其中mi為正整數,並且1<=mi<=n,此時, 為n的乙個劃分。如果中的最大值不超過m,即max<=m,那麼我們稱之為整數n的乙個m劃分。

現在給出你正整數n和m,請你輸出n的m劃分的數量。

例如,當n=4時,有5個劃分,即, , , , 。

注意,4=1+3和4=3+1被認為是同乙個劃分。

輸入檔案以eof結束。

每組資料佔一行,有兩個正整數n和m。(n,m<=50)

輸出n的m劃分的數量。

4 4

5

資料量不大,遞迴演算法實現:

1 #include 2 #include 

3 #include 4 #include 5

6using

namespace

std;

78 unsigned long getpartitioncount(int n, int

max)919

20int

main()

2129

return0;

30 }

view code

根據n和m的關係,考慮以下幾種情況:

(1)當 n = 1 時,不論m的值為多少(m > 0 ),只有一種劃分即 ;

(2)  當 m = 1 時,不論n的值為多少,只有一種劃分即 n 個 1,;

(3)  當 n = m 時,根據劃分中是否包含 n,可以分為兩種情況:

(a). 劃分中包含n的情況,只有乙個即 ;

(b). 劃分中不包含n的情況,這時劃分中最大的數字也一定比 n 小,即 n 的所有 ( n - 1 ) 劃分。

因此 f(n, n) = 1 + f(n, n-1);

(4) 當 n < m 時,由於劃分中不可能出現負數,因此就相當於 f(n, n);

(5) 但 n > m 時,根據劃分中是否包含最大值 m,可以分為兩種情況:

(a). 劃分中包含 m 的情況,即 }, 其中  的和為 n - m,可能再次出現 m,因此是(n - m)的 m 劃分,因此這種劃分

個數為 f(n-m, m);

(b). 劃分中不包含 m 的情況,則劃分中所有值都比 m 小,即 n 的 ( m - 1 ) 劃分,個數為 f(n, m - 1);

因此 f(n, m) = f(n - m, m) + f(n, m - 1);

綜合以上情況,我們可以看出,上面的結論具有遞迴定義特徵,其中(1)和(2)屬於回歸條件,(3)和(4)屬於特殊情況,將會轉換為情況(5)。而情況 (5)為通用情況,屬於遞推的方法,其本質主要是通過減小m以達到回歸條件,從而解決問題。其遞推表示式如下:

f(n, m) =      1;                                        ( n = 1 or m = 1 )

f(n, n);                                 ( n < m )

1+ f(n, m - 1);                      ( n = m )

f(n - m, m) + f(n, m - 1);       ( n > m )

母函式法解決整數劃分

問題描述 把乙個整數n劃分成1到n的劃分,例如3可以劃分為1 1 1,1 2,3這三種劃分,那麼求n的劃分數。解題思路 可以把1,設為x的0次方 x 0 把1,設為x的1次方 x 1 把n,設為是x的n次方 x n 那麼1可能出現,0,1,2,3,4,5,6.n次,而2可能出現0,1,2,3,n 2...

整數拆分問題 遞迴法

整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都涉及到。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 m3 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m,則稱它屬於n的乙個m劃分。這裡我們記n的m劃分...

整數劃分問題遞迴

整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們...