NYOJ 571 整數劃分 三

2021-07-30 09:44:28 字數 1101 閱讀 1667

描述

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

輸入

每組輸入是兩個整數n和k。(1 <= n <= 50, 1 <= k <= n)

輸出對於輸入的 n,k;

第一行: 將n劃分成若干正整數之和的劃分數。

第二行: 將n劃分成k個正整數之和的劃分數。

第三行: 將n劃分成最大數不超過k的劃分數。

第四行: 將n劃分成若干個 奇正整數之和的劃分數。

第五行: 將n劃分成若干不同整數之和的劃分數。

第六行: 列印乙個空行

樣例輸入

5 2

樣例輸出

723

33

提示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的...