描述
整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。
當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 相當於把...