一 递归求组合数

设函数为void    comb(int m,int k)为找出从自然数1、2、... 、m中任取k个数的所有组合。

分析:当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1数的组合。这就将求m个数中取k个数的组合问题转化成求m-1个数中取k-1个数的组合问题。

设函数引入工作数组a[ ]存放求出的组合的数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[ ]中的一个组合输出。第一个数可以是m、m-1、
...、k,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未确定组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。

求组合数C(m,k);并分别打印出来

/*                   组合数                           */
#if 0
#define N 100
int a[N];

int count=0;
//求组合数C(m,k)个数,k>=1
int  comb1(int m,int k)//(C(m,k))
{     
    int i;
    for (i=m;i>=k;i--)
    {
        if (k>1)
        {
            comb1(i-1,k-1);
        }
        else
        { 
            count++;
            //cout<<m<<":"<<i<<",";
        }
    }

    
    return count;           
}
//求组合数C(m,k)个数并分别从大到小遍历
int  comb2(int m,int k)//(C(m,k))
{    
    int i,j;
    for (i=m;i>=k;i--)
    {
        a[k]=i;
        if (k>1)
        {
            comb2(i-1,k-1);
        }
        else
        { 
            count++;
            for (j=a[0];j>0;j--)
            {
                cout<<a[j];
            }
            cout<<",";
            
        }
    }
    
    return count;           
}
int main()
{
    int m,k;
    cin>>m>>k;
    a[0]=k;
    int num=comb2(m,k);
    cout<<endl;
    cout<<num<<endl;
    return 0;
}
#endif

 

posted on 2014-07-07 13:10  Yogurshine  阅读(18818)  评论(0编辑  收藏  举报