求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2

作者:张小二

nyoj90 ,可以使用递归的方式直接计算个数,也可以通过把满足的个数求出来计数,因为在juLy博客上看到整数划分,所以重写了这个代码,就是列出所m的可能性,提交后正确。acmer的入门;

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

using namespace std;

int a[30]={0};//保存分解的状况

void fun(int a[],int lev,int left,int &count) //lev表示计算到数组的第几个,left剩余数的大小,count的目的是为了返回答案;

{

    if(left<0) return;

    

if(left==0&&lev!=1) // 因为题目要求中4分解不要4,所以lev=1的去掉

    {

    /*    for(int i=1;i<lev;i++)

        {

            cout<<a[i]<<"\t";

        }

        cout<<endl;*/

        count++;





    

    }

    else

    {

        for(int i=1;i<=left;i++)

        {

            if(i>=a[lev-1])   //列出所有大于lev前一个数的可能性

            {



                a[lev]=i;    

                fun(a,lev+1,left-i,count);

                

            

                

            

                

            

            

            

            }

        

        

        }

    

    

    }





}

int main()

{

    int n;

    cin>>n;

    while(n--)

    {

        int ans=0;



        int tem;

        cin>>tem;

        fun(a,1,tem,ans);

        cout<<ans<<endl;



    

    

    }

    



    system("pause");







return 0;

}

你可能感兴趣的:(组合)