正整數的一種拆分可以理解為將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\n",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 */
另一種辦法是母函數法
