递归实现指数型枚举
题目:从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
通过画图模拟可以看到,若我们选好了 1 2 3
, 我们可以再退到是否选择3的情况,因此选与不选这样实现:
st[u] = true;
dfs(u + 1);
st[u] = false;
dfs(u + 1);
code:
#include <iostream>
using namespace std;
const int N = 20;
bool st[N];
int n;
void dfs(int u){
if(u > n){
for (int i = 1; i <= n; i ++)
if (st[i])
cout << i << ' ';
cout << endl;
return;
}
st[u] = true;
dfs(u + 1);
st[u] = false;
dfs(u + 1);
}
int main(){
cin >> n;
dfs(1);
return 0;
}
递归实现排列型枚举(全排列)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int p[N];
bool st[N];
int n;
void dfs(int u){
if (u > n){
for (int i = 1; i <= n; i ++){
cout << p[i] << " ";
}
cout << endl;
}
for (int i = 1; i <= n; i ++){
if (!st[i]){
p[u] = i;
st[i] = 1;
dfs(u + 1);
st[i] = 0;
}
}
}
int main(){
cin >> n;
dfs(1);
return 0;
}