题目描述:排列与组合是常用的数学方法,其中组合就是从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; }