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;
    }
  • 相关阅读:
    *HDU 1392 计算几何
    *HDU 1115 计算几何
    *HDU 1086 计算几何
    *HDU 2108 计算几何
    HDU 1528 贪心模拟/二分图
    HDU 1281 二分图
    *HDU1150 二分图
    *HDU1151 二分图
    *HDU 1068 二分图
    *HDU 1054 二分图
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6428427.html
Copyright © 2011-2022 走看看