递归实现组合型枚举
从 $1∼n$ 这 $n$ 个整数中随机选出 $m$ 个,输出所有可能的选择方案。
输入格式
两个整数 $n,m$ ,在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行 $1$ 个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。
数据范围
$n>0 ,$
$0≤m≤n ,$
$n+(n−m)≤25$
输入样例:
输出样例:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | 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
 
 | 
题解
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 
 | #include<bits/stdc++.h>using namespace std;
 
 int n,m;
 vector<int> num;
 
 void dfs(int k)
 {
 
 if(num.size() > m || num.size() + (n - k + 1) < m)
 return;
 
 if(k == n + 1)
 {
 for(int i = 0;i < num.size();++i)
 cout << num[i] << " ";
 
 cout << endl;
 return;
 }
 
 
 num.push_back(k);
 dfs(k+1);
 
 num.pop_back();
 
 
 dfs(k+1);
 }
 
 int main(void)
 {
 cin >> n >> m;
 
 dfs(1);
 
 return 0;
 }
 
 |