/*第一行:將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]:相當於把k個1從n中拿出來,然後和n-k的拆分項相加的個數
第三行:將n劃分成若干最大不超過k的正整數之和的劃分數。
dp[n][k]
第四行:將n劃分成若干奇正整數之和的劃分數。
dp1[i][j]是當前的劃分數為i,最大值為j時的中的劃分數,則狀態轉移方程為
dp1[i][j]=dp1[i][i]if(j>i&&j%2==1)
=dp1[i][i-1]if(j>i&&j%2==0)(最大數不可能為偶數)
=dp1[i-j][j]+dp1[i][j-2]沒用到j時劃分不變,即dp1[i][j-2],用到則是dp1[i-j][j];
第五行:將n劃分成若干完全不同正整數之和的劃分數。
dp2[i][j]可以分兩種情況:1、dp1[i][j-1]為不選擇j時的方案 2、dp1[i-j][j-1]為選擇j時的方案
0-1揹包:dp2[i][j]=dp2[i][j-1]+dp2[i-j][j-1]
第六行:將n劃分成不超過k個正整數之和的劃分數。
dp[n][k]: ferrers共軛影象
比如 24=5+5+5+4+3+2,6個數,最大數為5
24=6+6+5+4+3 5個數,最大數為6
*/#include
#define n 52
int dp[n][n] = , dp1[n][n] = , dp2[n][n] = ;
void
divid()
}void
divid1()
else
dp1[i][j] = dp1[i-j][j] + dp1[i][j-2
] ; }
}void
divid2()
for( int i = 2 ;i < n ; i++)
for( int j = 1 ;j < n ; j++)
}int
main()
return0;
}
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 1時,不論m的值為多少 m 0 只有一種劃分即 當m 1時,不論n的值為多少,只有一種劃分即n個1,當n m時,由於最大值只能是n,所以此時f n,m f n,n 當n m時,根據劃分中是否包含n,可以分為兩種情況 1 劃分中包含n的...