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;
}