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;
    }
  • 相关阅读:
    JQuery Object vs. DOM element
    创建自己的taglib 并打包入jar
    基于中间件/构件的开发
    如何创建RESTFul Web服务
    企业级API设计
    我的面试库
    架构师在敏捷中是猪还是鸡
    网络安全那点事
    HTML元素定位
    Windows 命令集合
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6428427.html
Copyright © 2011-2022 走看看