经典DP 整数划分问题 用动态规划递推
设dp[i][j]表示拆分数i,最大的那么数字不超过j的方案数。
第一种是最后一个数不超过j-1,此时方案数为dp[i][j-1],否则最后一个数字刚好是j,此时的方案数是dp[i-j][j]。
注意一些边界的情况。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <string> 5 #include <algorithm> 6 using namespace std; 7 #define maxn 130 8 int dp[130][130]; 9 void init(){ 10 memset(dp, 0, sizeof(dp)); 11 for(int i = 0; i <= 125; i++){ 12 dp[0][i] = 1; //0 13 dp[i][1] = 1; //都拆分为1 14 dp[1][i] = 1; 15 } 16 for(int i = 2; i <= 125; i++){ 17 for(int j = 2; j <= 125; j++){ 18 if(j<=i)dp[i][j] = dp[i][j-1] + dp[i-j][j]; 19 else dp[i][j] = dp[i][i]; 20 } 21 } 22 } 23 int main(){ 24 int N; 25 init(); 26 while(scanf("%d", &N) != EOF){ 27 cout<<dp[N][N]<<endl; 28 } 29 return 0; 30 }