求正整数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]<<"	";
        }
        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;
}

原文地址:https://www.cnblogs.com/hansongjiang/p/3772397.html