递归实现组合型枚举

· · 个人记录

题目描述

从1~n这n个整数中随机选出m个,输出所有可能的选择方案。

输入格式

两个整数n,m,在同一行用空格隔开。

输出格式

按照从小到大的顺序输出所有方案,每行1个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 5 7排在1 3 6 8前面)。

样例

样例输入
5  3
样例输出
12  3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5

数据范围与提示

### 思路 $dfs$即可。 ## 代码 ```c++ #include<bits/stdc++.h> using namespace std; const int N=1e3+10; int n,m,ans[N],cnt;//ans数组保存答案,cnt保存当前个数. void dfs(int x,bool fg)//x为当前数,fg表示取或不取. { if(fg==1) ans[++cnt]=x; if(cnt==m) { for(int i=1;i<=cnt;++i) printf("%d ",ans[i]); printf("\n"); return; } int last=cnt; if(x==n) return; dfs(x+1,1); cnt=last; dfs(x+1,0); } int main() { cin>>n>>m; for(int i=1;i<=n;++i) cnt=0,dfs(i,1);//cnt归零很重要. return 0; } ```