演算法訓練 數的劃分 (動態規劃)
阿新 • • 發佈:2019-02-12
演算法訓練 數的劃分
時間限制:1.0s 記憶體限制:256.0MB
問題描述
將整數n分成k份,且每份不能為空,任意兩份不能相同(不考慮順序)。
例如:n=7,k=3,下面三種分法被認為是相同的。
1,1,5; 1,5,1; 5,1,1;
問有多少種不同的分法。 輸入格式 n,k 輸出格式 一個整數,即不同的分法 樣例輸入 7 3 樣例輸出 4 {四種分法為:1,1,5;1,2,4;1,3,3;2,2,3;} 資料規模和約定 6<n<=200,2<=k<=6
例如:n=7,k=3,下面三種分法被認為是相同的。
1,1,5; 1,5,1; 5,1,1;
問有多少種不同的分法。 輸入格式 n,k 輸出格式 一個整數,即不同的分法 樣例輸入 7 3 樣例輸出 4 {四種分法為:1,1,5;1,2,4;1,3,3;2,2,3;} 資料規模和約定 6<n<=200,2<=k<=6
又一個比較巧妙而經典的動態規劃題目
#include<cstdio> #include<cstring> int dp[202][10]; int main() { int n,k; scanf("%d %d",&n,&k); for(int i=1;i<=n;i++) { for(int j=1;j<=i&&j<=k;j++) { if(j==1||i==j) { dp[i][j]=1; } else if(j==2) { dp[i][j]=i/j; } else { dp[i][j]+=dp[i-1][j-1]+dp[i-j][j];//包含1就是把一分出來,把i-1分成j-1份,不包含1,給j份每個一個1,然後將剩下的i-j個分成j份 } } } printf("%d",dp[n][k]); return 0; }