zoukankan      html  css  js  c++  java
  • 求组合数 C++程序

    一 递归求组合数

    设函数为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
  • 相关阅读:
    2020-2021-1 20201217《信息安全专业导论》第十一周学习总结
    python模拟进程状态
    博客文章汇总
    20201225 张晓平《信息安全专业导论》第十三周学习总结
    网站设计
    gpg
    20201225 张晓平《信息安全专业导论》第十二周学习总结
    wire shark
    ssh
    成绩调节
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/3829490.html
Copyright © 2011-2022 走看看