整数的划分问题

详见(http://www.darkswordzone.com/?p=749

对于一个正整数n的划分,就是把n表示成一系列正整数的和,划分与次序无关。
如一个正整数5,可以划分为:
[5]
[4,1]
[3,2] [3,1,1]
[2,2,1] [2,1,1,1]
[1,1,1,1,1]
将一个正整数n划分,共有多少种划分方式?
上面的例子第一行,所有加数不超过5;
第二行,所有加数不超过4;
。。。。。。。
第五行,所有加数不超过1.
定义int fun(int n,int m)表示正整数n,所有加数不超过m的划分数目。
那么
1,n==1或m==1 时共有1种划分方式。
2,n==m时 fun(n,m)=fun(n,m-1)+1 。
3,n>m时, 我们发现只要将fun(n,m-1)加上包含加数m的划分数就等于div(n,m)。即:fun(n,m) = fun(n,m-1) + 包含加数m的划分数。
包含加数m的划分数可以转化为:fun(n-m,m)。所以3可以表示为:
fun(n,m) = fun(n,m-1) + fun(n-m,m)
4、n < m 等同于2.
代码如下:

View Code
 1 //求正整数n的划分数
 2 #include<iostream>
 3 using namespace std;
 4 int fun(int n,int m){
 5     if(n==1 || m==1)
 6          return 1;
 7     else if(n==m)
 8          return fun(n,m-1)+1;
 9     else if(m>n)
10          return fun(n,n);
11     else
12          return fun(n,m-1)+fun(n-m,m);
13 }
14 int main(){
15     int n;
16     while(cin>>n){
17          cout<<fun(n,n)<<endl;
18     }
19 return 0;
20 }

 

 

转载于:https://www.cnblogs.com/xxx0624/archive/2012/07/21/2602037.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值