正整数的一种拆分可以理解为将n个无区别的球放入n个无区别的盒子,每种方案就是一种拆分。
这篇博客
http://blog.chinaunix.net/uid-26548237-id-3503956.html
讲的非常好,易于理解
一个用动态规划求解的办法如下
1 #include <cstdio> 2 #include <cstring> 3 int n; 4 int dp[1002][1002]; 5 6 int main(int argc, char const *argv[]) 7 { 8 memset(dp, 0, sizeof(dp)); 9 for(int i = 0; i < 1000; i++) { 10 dp[0][i] = 1; 11 } 12 for(int i = 1; i <= 102; i++) { 13 for(int j = 1; j <= 102; j++) { 14 if(j <= i) { 15 dp[i][j] = dp[i][j-1] + dp[i-j][j]; 16 } 17 else { 18 dp[i][j] = dp[i][j-1]; 19 } 20 21 } 22 } 23 while(scanf("%d",&n) != EOF) { 24 printf("%d ",dp[n][n]); 25 } 26 return 0; 27 } 28 /* 29 dp[3][1] = dp[3][0] + dp[2][1] = 1; 30 dp[3][2] = dp[3][1] + dp[1][2] = 1 + 1 = 2 31 dp[3][3] = dp[3][2] + dp[0][3] = 2 + 1 = 3 32 */
另一种办法是母函数法