zoukankan      html  css  js  c++  java
  • [递归入门] 组合数

    题目描述:排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r < = n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。 要求根据输入的n和r,输出所有的组合数。

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    
    //递归实现 
    int n,r;
    const int maxn=30;
    int a[maxn];
    int flag[maxn]={0};
    
    vector<int> ans;
    
    void DFS(int num,int pre)
    {
        if(num==r)
        {
            for(int i=0;i<r;i++)
            {
                if(i>0) printf(" ");
                printf("%d",ans[i]);
            }
            printf("
    ");
            return ;
        }
        for(int i=0;i<n;i++)
        {
            if(flag[i]==0&&a[i]>pre)//为了去除重复,保证每个排列有序,当前元素可加入ans的条件是,当卡元素大于ans的最后一个元素
            {
                ans.push_back(a[i]);
                flag[i]=1;
                DFS(num+1,a[i]);
                //递归返回 
                ans.pop_back();
                flag[i]=0;
            }
        }
    }
    
    int main()
    {
        for(int i=0;i<maxn;i++)
        {
            a[i]=i+1;
        }
        scanf("%d %d",&n,&r);
        DFS(0,0);
        return 0;
    }
  • 相关阅读:
    php学习记录 易混淆
    自己学习smarty的一些代码 和记录
    Java 死锁
    Java多线程下单例
    Java 线程安全问题
    Java 线程状态
    Java 创建线程
    Java clone() 浅拷贝 深拷贝
    Java 多线程
    Java throw try catch
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6428427.html
Copyright © 2011-2022 走看看