樣題: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 #includeview code3 #include 4 #include 5
6using
namespace
std;
78 unsigned long getpartitioncount(int n, int
max)919
20int
main()
2129
return0;
30 }
根據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劃分。這裡我們...