整數拆分問題 遞迴法

2021-06-27 23:39:11 字數 1022 閱讀 7945

整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都涉及到。

所謂整數劃分,是指把乙個正整數n寫成如下形式:

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

如果中的最大值不超過m,即max

<= m,則稱它屬於n的乙個m劃分。這裡我們記n的m劃分的個數為f(n,m);

例如當n=4時,它有5個劃分:、、、、;

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

該問題是求出n的所有劃分個數,即f(n,n

)。下面我們考慮求f(n,m)的方法。

(一)方法一——

遞迴法

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

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

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

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

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

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

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

(4)當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)為通用情況,屬於遞迴的方法,其本質主要是通過減少n或m以達到回歸條件,從而解決問題。

其遞迴表示式如下所示。

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

樣題 sdut2015寒假結訓賽 開始我還以為是用揹包來做,但是寫完了 怎麼寫就是不對,並且在實現的時候確實有點地方我用揹包的演算法描述不了!後來查到可以用 遞迴 或者 母函式演算法!比賽時曾考慮過用遞迴來實現,但沒有推導出來,後來發現別人的部落格裡面寫著 整數劃分問題 應該在講解遞迴的時候就該學會...

遞迴 遞迴法解決排列問題

方法1 程式大致結構 約定 pl len pl 為最終放置結果的陣列 len為陣列的長度 ele為參與排列的個元素出現的個數 i為pl中下標 假設參與排列的元素有abcd run ele,int i 注意 在遞迴塊內,不應對所傳入的引數進行改變 每個遞迴塊所得到的原始引數應保持一致。舉例 abcde...

整數拆分問題

問題 對於1個正整數n,將其拆分成幾個正整數的和,如何拆分可使得其乘積最大?csdn使用者pathuang68給出的結論是 如果不在乎是否為整數的話,那麼把每份平均分為e 2.71828459045.時,所得到的乘積是最大的,如果要是整數的話,那麼就選盡可能地靠近e的整數即可,比如3。具體證明請參見...