整数拆分问题


整数分拆问题是一个古老而又十分有趣的问题。所谓整数的分拆 [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 */

另一种办法是母函数法


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM