描述
整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。
輸入
每組輸入是兩個整數n和k。(1 <= n <= 50, 1 <= k <= n)
輸出對於輸入的 n,k;
第一行: 將n劃分成若干正整數之和的劃分數。
第二行: 將n劃分成k個正整數之和的劃分數。
第三行: 將n劃分成最大數不超過k的劃分數。
第四行: 將n劃分成若干個 奇正整數之和的劃分數。
第五行: 將n劃分成若干不同整數之和的劃分數。
第六行: 列印乙個空行
樣例輸入
5 2
樣例輸出
72333
提示1.將5劃分成若干正整數之和的劃分為: 5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
2.將5劃分成2個正整數之和的劃分為: 3+2, 4+1
3.將5劃分成最大數不超過2的劃分為: 1+1+1+1+1, 1+1+1+2, 1+2+2
4.將5劃分成若干 奇正整數之和的劃分為: 5, 1+1+3, 1+1+1+1+1
5.將5劃分成若干不同整數之和的劃分為: 5, 1+4, 2+3
這道題差不多包含了劃分數絕大部分的問題,其實前三個小問,完全可以用乙個dp1陣列搞定,為了清晰還是用了兩個。
res1=dp1[n][k]-dp1[n][k-1];
如果有不明白的可以看這篇部落格,講的相當清晰。
#include#include#define max 51
int dp1[max][max];//把i劃分成不超過j的劃分數
int dp2[max][max];//把i劃分成j個數之和的劃分數
int dp3[max][max];//把i劃分成不大於j的不同的數的劃分數
int f[max][max];//把i劃分成j個偶數的劃分數
int g[max][max];//把i劃分成j個奇數的劃分數
void init()
else if(i==j)
else
}f[0][0]=g[0][0]=1;
for(i=1;i
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 相當於把...
nyoj 571 整數劃分 三 (遞迴)
描述 整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。當n 1時,不論m的值為多少 m 0 只有一種劃分即 當m 1時,不論n的值為多少,只有一種劃分即n個1,當n m時,由於最大值只能是n,所以此時f n,m f n,n 當n m時,根據劃分中是否包含n,可以分為兩種情況 1 劃分中包含n的...