整数划分问题

 整数划分问题
将正整数 n表示成一系列正整数之和:n=n1+n2+…+nk,
其中 n1≥n2≥…≥nk≥1,k≥1。
正整数 n的这种表示称为正整数n的划分。求正整数n的不
同划分个数。
 
例如正整数 6有如下11种不同的划分:
    6;
    5+1;
    4+2,4+1+1;
    3+3,3+2+1,3+1+1+1;
    2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
 
前面的几个例子中,问题本身都具有比较明显的递归关系,因而容易用递归函数直接求解。
在本例中,如果设 p(n)为正整数n的划分数,则难以找到递归关系,因此考虑增加一个自变量:将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系。
 

 

int q(int n,int m)
{
    if(n<1)||(m<1) return 0;
//
    if (n==1)||(m==1)) return 1;
//当最大加数不大于1时,任何正整数n只有一种划分形式,即n=1+1+…+1;
    if(n<m) return q(n,n);
//最大加数不能大于n,故m>n时=q(n,n)
    if(n==m) return (q(n,n-1)+1);
//正整数n的划分由n 1 =n的划分和n 1<=n-1的划分组成。
    return q(n,m-1)+q(n-m,m);
//正整数n的最大加数不大于m的划分由n 1=m的划分和n 1<=m-1的划分组成。
}
这样只能得到可能分解的个数,如果要想得到每种分解的情况,就要另外设计算法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值