[递归入门] 组合数
2017-02-22 13:10
204 查看
题目描述:排列与组合是常用的数学方法,其中组合就是从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("\n"); 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; }
相关文章推荐
- 【递归入门】组合+判断素数
- 【递归入门】组合+判断素数
- 简单易懂的程序语言入门小册子(4):基于文本替换的解释器,递归,如何构造递归函数,Y组合子
- 5973 Problem B 【递归入门】组合的输出
- 【递归入门】组合的输出
- 【递归入门】组合的输出
- 5974 Problem C 【递归入门】组合+判断素数
- 递归实现数字排列组合
- 类的递归和组合模式
- 递归实现数字排列组合
- 类的递归和组合模式
- 递归实现数字的组合(C++)
- 一个递归小函数,用于组合树控件的文本
- 非递归方式遍历所有组合
- 递归----组合
- 类的递归和组合模式
- 非递归解决组合问题
- 算法基础系列之一:非递归求和为数值N的所有组合
- 递归实现无重复组合
- 复合控件与事件(1)——基础入门,组合也是一种封装