zoukankan      html  css  js  c++  java
  • 组合数(dfs)

    组合数

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3 
    描述
    找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
    输入
    输入n、r。
    输出
    按特定顺序输出所有组合。
    特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
    样例输入
    5 3
    样例输出
    543
    542
    541
    532
    531
    521
    432
    431
    421
    321

    解:(https://blog.csdn.net/a15994269853/article/details/21109443)递归算法设计时要找出大规模问题与小规模问题之间的关系。首先固定第一个数5,其后求解n=4,r=2的组合数,共6个组合,其次固定第一个数4,其后就是求解n=3,r=2的组合数,总共是3个组合数;最后固定第一个数3,其后就是求解n=2,r=2的组合数,共一个组合。递归思路就是:n个数中r个数组合递推到n-1个数中r-1个数有组合,n-2个数中r-1个数有组合,r-1个数中r-1个数组合;当r=1时,递归终止。

    #include<iostream>
    using namespace std; 
    int n,r;
    int num[100];
    int dfs(int x,int y){ 
        int i;
        if(y==0){ 
            for (i=r; i>0; i--)
               cout<<num[i];//直到r==1时结束 
            cout<<endl;
            return 0;
        }
        else 
            for (i=x; i>=y; i--){//先遍历最大数的组合,如果n==5,先遍历r==3时,5的所有组合 
                num[y]=i;
                dfs(i-1,y-1);//再依次遍历4,3.... 
            }
    }
    int main(){ 
        cin>>n>>r;
        dfs(n,r);
        return 0;
    }
  • 相关阅读:
    LVS DR实验!
    Memcached 与 Redis 区别
    LVS笔试题!
    并发编程拓展知识
    并发编程之协程
    并发编程之线程
    并发编程之多道技术
    粘包问题与socketserver实现并发
    套接字通信
    git的使用
  • 原文地址:https://www.cnblogs.com/geziyu/p/9302894.html
Copyright © 2011-2022 走看看