整数划分问题

接下来我将详细的说下整数划分问题:

将正整数n表示成一系列正整数之和,

n=n_{1}+n_{2}+...+n_{k} (其中,n_{1}\geqslant n_{2}\geqslant ...\geqslant n_{k}\geqslant 1,k\geqslant 1

正整数n的这种表示称为正整数n的划分。正整数n的不同的划分个数称为正整数n的划分数,记为p(n)

例如,正整数6有如下11种不同的划分,所以p(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。

在正整数n的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n,m)。可以建立q(n,m)的如下递归关系。

(1)q(n,1)=1,n\geqslant 1

当最大加数n1不大于1时,任何正整数n只有一种划分形式,即n=1+1+...+1

(2)q(n,m)=q(n,n),m\geqslant n

最大加数n1实际上不能大于n。因此q(1,m)=1。

(3)q(n,n)=1+q(n.n-1) ,n=m

正整数n的划分由n1=n的划分和n1≤n-1的划分组成。

(4)q(n,m)=q(n,m-1)+q(n-m,m),n> m> 1

正整数n的最大加数n1不大于m的划分由n1=m的划分和n1≤m-1的划分组成。

由以上关系给出计算q(n,m)的递归式

q(n,m)=\begin{cases} & \text{ } 1 \\ & \text{ } q(n,n)\\ & \text{ } 1+q(n,n-1)\\ & \text{ } q(n,m-1)+q(n-m,m) \end{cases}

marlab代码如下

function num=count(n,m)  
    if n==1||m==1  
        num=1;  
    else  
        if n<m  
            num=count(n,n);  
        end  
        if n==m  
            num=1+count(n,m-1);  
        end  
        if n>m  
            num=count(n,m-1)+count(n-m,m);  
        end  
    end  
end  

当我们输入n=10,m=10时,得到结果正整数10的划分为42种情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值