nyoj 571 整數劃分 三 (遞迴)

2021-08-03 19:04:58 字數 2611 閱讀 2887

描述

整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。

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

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

當n<m時,由於最大值只能是n,所以此時f(n,m)=f(n,n);

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

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

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

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

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

(1) 劃分中包含m的情況,即}, 其中 的和為n-m,

可能再次出現m,因此是(n-m)的m劃分,因此這種劃分個數為f(n-m, m);

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

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

2.將n劃分成m個正整數之和

首先當m=

1時,f(n,m)=

1;當n<m時,f(n,m)=

0;然後根據劃分的m個整數中是否包含1,可以分為兩種情況:

(1)假設分成的m個整數中不包含1,那麼 此時 f (n-m,m)就是這部分的總情況,因為既然讓它不包含1,

就先將m個整數都分出1,此時n變為n-m,再將n分為m個整數,這m個整數再加上原先分出的1,就肯定不含1了。

(2)假設分成的m個整數至少有乙個1,那麼此時f(n-1,m-1)

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

1,m-

1);

3.將n劃分成最大數不超過m(同1)

4.將n劃分成若干奇正整數之和

將n劃分成若干個正整數之和的改進版

我們首先需要調整邊界狀態:當m=

1時,f(n,m)=

1;當n=

1而m>

1時,f(n,m)=

0其次,我們需要調整狀態轉換公式:

f(n-m,m)+f(n,m-

1); (n>m) 應該更改為:f(n-m,m)+f(n,m-

2); (n>m)

這是因為我們不能取偶數,故而當m為奇數的時候,m-

1為偶數(只能被選擇0次),f(n,m-

1)=f(n,m-

2);

5.將n劃分成若干不同正整數之和

將n劃分成若干個正整數之和的改進版

此時我們需要調整我們的狀態轉換公式。

f(n-m,m)+f(n,m-

1); (n>m) 應該更改為:f(n-m,m-

1)+f(n,m-

1); (n>m)

為什麼呢?因為每個數最多使用一次,f(n-m,m-

1)表示我們取了數m,f(n,m-

1)表示我們沒取,但是

無論取不取數m我們以後都不會再次取數m了。

當然,我們還需要調整邊界狀態:當m=

1時,f(n,m)=

1;當n=

1而m>

1時,f(n,m)=

0。其他不變!

**:

#include

const

int n=50;

const

int maxn=55;

int dp1[maxn][maxn],dp2[maxn][maxn],dp3[maxn][maxn],dp4[maxn][maxn];

void init()

//將n劃分成m個正整數之和

dp2[0][0]=1;

for(int i=1; i<=n; ++i)

dp2[i][1]=1;

for(int i=2; i<=n; ++i)

for(int j=2; j<=i; ++j)

dp2[i][j]=dp2[i-1][j-1]+dp2[i-j][j];

//將n劃分成若干奇正整數之和

for(int i=1; i<=n; ++i)

dp3[i][1]=1;

for(int i=1; i<=n; ++i)

dp3[0][i]=1;

dp3[0][0]=1;

for(int i=1; i<=n; ++i)

for(int j=2; j<=n; ++j)

else

dp3[i][j]=dp3[i-j][j]+dp3[i][j-2];

}else dp3[i][j]=dp3[i][j-1];

}//將n劃分成若干不同正整數之和

for(int i=1; i<=n; ++i)

for(int i=2; i<=n; ++i)

for(int j=1; j<=n; ++j)

}int main()

return

0;}

isiqi

苯苯的小木屋

NYOJ 571 整數劃分 三

描述 整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。輸入 每組輸入是兩個整數n和k。1 n 50,1 k n 輸出對於輸入的 n,k 第一行 將n劃分成若干正整數之和的劃分數。第二行 將n劃分成k個正整數之和的劃分數。第三行 將n劃分成最大數不超過k的劃分數。第四行 將n劃分成若干個 奇正整...

nyoj 571 整數劃分 三

時間限制 1000 ms 記憶體限制 65535 kb 難度 5描述 整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。輸入 多組輸入資料。每組輸入是兩個整數n和k。1 n 50,1 k n 輸出對於輸入的 n,k 第一行 將n劃分成若干正整數之和的劃分數。第二行 將n劃分成k個正整數之和的劃分...

NYOJ 571 整數劃分 三

第一行 將n劃分成若干正整數之和的劃分數。狀態轉移方程 dp i j 和為i 最大數不超過j的拆分數 dp i j 可以分為兩種情況 1 拆分項至少有乙個j 2 拆分項乙個j也沒有 dp i j dp i j j dp i j 1 第二行 將n劃分成k個正整數之和的劃分數。dp n k k 相當於把...