計算整數的劃分數

2021-08-19 18:11:43 字數 994 閱讀 4758

問題描述 :將一正整數劃分成一系列的正整數之和。

n=n1+n2+……+nk(n1>=n2>=n3….>=nk)

被稱為正整數n的乙個劃分,乙個正整數存在著不同的劃分。例如6

6=66=5+1

6=4+2 6=4+1+1

6=3+3 6=3+2+1 6=3+1+1+1

6=2+2+2 6=2+2+1+1 6=2+1+1+1+1

6=1+1+1+1+1+1

若設p(n,m)表示正整數n的所有不同的劃分中,最大加數不大於m的劃分個數。

則可以建立一下遞迴:

(1)、p(n,1)=1,n>=1;

(2) p(n,m)=p(n,n),m>=n;

(3) p(n,n)=1+p(n,n-1);

(4)p(n,m)=p(n,m-1) + p(n-m,m), n>m>1

其上三種大家均可以理解,可唯獨第四個卻半懂非懂的,解釋一下第四個的分析:

「正整數n的最大加數不大於m的劃分數」可以理解成「n的最大加數不大於m-1的劃分數p(n,m-1)」和「n的最大加數為m的劃分數」之和。

舉例說明:p(6,4)等於「6的最大加數不大於3的劃分數p(6,3)」和「6的最大加數為4的劃分數」的和。而「6的最大加數為4的劃分數」為2,從上述例子也可以看出,也就是「6-4的最大加數不大於4的劃分數」,即為2,也就是p(6-4,4)=p(2,4)=2.

簡單來看,n的最大加數為m的劃分數不就是p(n-m,n-m),可以這樣理解,但這僅僅是乙個特例,不可代表全部,如最大加數為2的劃分數呢,可以去試試。就會驚奇的發現結果就不是啦。

根據上述分析,可得到遞迴函式式:

計算正整數的劃分數

q 將一正整數表示成各種正整數之和的形式,可以寫成的所有劃分方式的總共數量叫做劃分數,程式設計實現輸出任意乙個正整數的劃分數。採用遞迴方法,而關鍵在於寫出遞迴函式。對於該題,如下 div int intnum,int max addnum 1,max addnum 1 div int num,num...

整數劃分(數的m劃分)

includeusing namespace std int f int n,int m n代表數字,m代表n的m劃分 int main 方式二 動態規劃 dp i j 表示i的j次劃分的情況種數 狀態轉移方程為dp i j dp i j j dp i 1 j 1 1.dp i 1 j 1 表示劃分...

整數劃分 劃分數(DP動態規劃)

給你乙個正整數n,讓你計算出n的m劃分有幾種方法。思路 定義dp i j 為i的j劃分,即將i劃分為j個數字之和的方案數。1 當j i時,此時,劃分個數不超過i,此時是正常的劃分。劃分的結果一定只有兩種型別 一種是j個數字,都大於0。另一種是有0,即不夠劃分j個,用0來湊的。j個數字中存在0的,其實...