递归/非递归实现组合型枚举
题目描述
从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。n>0, 0<=m<=n, n+(n-m)<=25。
输入
一个整数n。
输出
按照从小到大的顺序输出所有方案,每行1个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 9 12排在1 3 10 11前面)。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 9 12排在1 3 10 11前面)。
样例输入
5 3
样例输出
1 2 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
分析:分析有什么好分析的,利用递归打印即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <map> #include <queue> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; int n,m,num[100]; vector<int>data; void init(){ cin>>n>>m; range(i,0,n-1)num[i]=i+1; } void dfs(int head,int len){ range(i,head,n-len){ int tmp=num[i]; if(tmp){ data.push_back(tmp); num[i]=0; if(len>1)dfs(i+1,len-1); else range(j,0,data.size()-1)cout<<data[j]<<(j==data.size()-1?'\n':' '); data.pop_back(); } num[i]=tmp; } } void solve(){ if(!m){cout<<endl;return;} dfs(0,m); } int main() { init(); solve(); return 0; }