整数划分问题

将正整数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。

输入一个正整数,给出不同的划分,并求出总数。

#include<iostream.h>

int d[50],sum=0;

void huafen(int m,int n,int k)    //将m分解为不大于n的组成数,k>=0是下标

{

       inti;

       if(0==m)                      //当m为0是表示得到一个划分,进行输出

       {

             

              sum++;                    //用来累计有多少种,并在最后输出。

              for(i=0;i<k;i++)

              {

                     cout<<d[i];

                     if(i<k-1)

                     cout<<"+";

                    

              }

              cout<<endl;

       }

for(i=(m<n? m:n);i>0;i--)//深度探索分解分解,大家可以适当输出m,n和K帮助理解递归

       {

    

              d[k]=i;

              huafen(m-d[k],d[k],k+1);  //递归分解,直到得到一个划分

       }

}

void main()

{

       intn;

       cout<<"请输入要划分的数: ";

       cin>>n;

       huafen(n,n,0);

       cout<<n<<"共有"<<sum<<"种不同划分"<<endl;

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值