整数拆分问题

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

另一种办法是母函数法

转载于:https://www.cnblogs.com/jasonJie/p/5814671.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值