整数拆分问题

整数分拆问题是一个古老而又十分有趣的问题。所谓整数的分拆[1]  ,指将一个正整数表示为若干个正整数的和。不考虑其求和的顺序,一般假定

满足
正整数的一种拆分可以理解为将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 */

另一种办法是母函数法

posted @ 2016-08-28 11:52  Jason杰  阅读(3562)  评论(0编辑  收藏  举报