AcWing_93 递归实现组合型枚举(递归、dfs、模板)

AcWing

93. 递归实现组合型枚举

使用二叉树模拟每一位的选择情况,a[N]数组当前每一位的选择数,visited[N]数组表示某个数是否已经被其他数位选择过。每次枚举的数应该大于前面的数位已经使用过的数;如果数不够用,直接剪枝即可(不剪也行)。

#include <bits/stdc++.h>
using namespace std;
int n, m;
const int N = 30, M = 30;
bool visited[N];
int a[M];
void dfs(int digit, int low){
    if(m - digit >= n - low) return;    // 剪枝
    if(digit > m){
        for(int i = 1; i <= m; i++) cout << a[i] << " \n"[i == m];
        return;
    }
    for(int i = low + 1; i <= n; i++){
        if(!visited[i]){
            visited[i] = true;
            a[digit] = i;
            dfs(digit + 1, i);
            visited[i] = false;
        }
    }
}
int main(){
    cin >> n >> m;
    dfs(1, 0);
    return 0;
}