递归实现组合型枚举,就是从n里面选出来m个数,输出所有的情况,属于前面指数型枚举问题的子集,只需要加一个剪枝的条件,指数型问题时枚举n个数1到n的长度的子集,而这个是只要枚举长度为m的子集,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
int n, m;
vi v;
void solve(int x) {
if (v.size() > m || v.size() + n + 1 - x < m) return;
if (x == n + 1) {
for (int i = 0; i < (int) v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
return;
}
v.pb(x);
solve(x + 1);
v.pop_back();
solve(x + 1);
}
int main() {
cin >> n >> m;
solve(1);
return 0;
}