• 求组合数 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
  • 相关阅读:
    前端 JS 原生JS实现一个单页应用的路由 router
    Gitbook 使用笔记
    EF Core 抓取SQL语句
    .NET5.0 MVC Session 的使用
    SQL Server 实用语句
    .NET5.0 MVC 生成发布(问题+技巧)
    服务器 SQL Sserver2012 开启远程连接
    windows 安装 Redis5.0 并运行
    前端 JS 学习笔记(知识点记录)
    CentOS 7 单机安装Redis Cluster(3主3从)
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/3829490.html
Copyright © 2020-2023  润新知