dfs:组合型枚举
题目:P10448 组合型枚举 - 洛谷
题意:从n个整数中选出m个数,输出所有可能方案
先画决策树,根据决策树写递归。
假设从4个数中选出3个数,相当于C43
首先,确定递归的结束条件:当vector.size() == m时,打印内容,return。
在上一道题"枚举子集",我们是用 pos > n 作为结束条件,这道题不能用pos > n,在这道题,pos不能代表元素个数。

在写决策树的过程中,我们可以发现一个规律。上一个递归填补的数字一定小于下一个递归的数字。
- 上一个递归的数字是1,下一个递归数字可以是2,3,4。
- 上一个递归的数字是2,下一个递归数字可以是3,4。
- 上一个递归的数字是3,下一个递归的数字只能是4。。。
针对这个规律,我们可以在递归内使用for循环,保证不回退:
for (int i = pos; i <= n; i++){a.push_back(i);dfs(i+1);a.pop_back();}
总代码:
#include <iostream>
#include <vector>using namespace std;
int n, m;
vector<int> a;void dfs(int pos)
{if (a.size() == m){for (auto x : a) {cout << x << " ";}cout << endl;return;}for (int i = pos; i <= n; i++){a.push_back(i);dfs(i + 1);a.pop_back(); }
}int main()
{cin >> n >> m;dfs(1);return 0;
}