题目链接:递归实现指数型枚举
普通版:
#include <iostream>
using namespace std;
int n;
int a[20];
bool vis[20];
// 当前枚举到第pos个坑, 上一个坑填的是start-1,这次只能从start开始找数填, 一共要填tar个坑
void dfs(int pos, int start, int tar) {
if(pos == tar+1) {
for(int i = 1; i <= tar; i++) cout<<a[i]<<" ";
cout<<endl;
return ;
}
for(int i = start; i <= n; i++) {
vis[i]=true;
a[pos]=i;
dfs(pos+1,i+1,tar);
vis[i]=false;
}
}
int main() {
cout << endl;
cin >> n;
for (int i = 1; i <= n; i ++ )
dfs(1, 1, i);
return 0;
}
动态数组版:
#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int > chosen;
void dfs(int x) {
if(x == n+1) {
for(int i=0; i<chosen.size(); i++) {
cout<<chosen[i]<<" ";
}
puts("");
return ;
}
//不选择x这个值
dfs(x+1);
//选择x这个值
chosen.push_back(x);
dfs(x+1);
chosen.pop_back();
}
int main() {
cin >> n;
dfs(1);
return 0;
}
位运算版:
#include<iostream>
using namespace std;
int n;
//pos是当前枚举的这个数,tar是记录哪些值被选
void dfs(int pos,int tar) {
if(pos == n) {
for(int i = 0; i<n; i++) {
if(tar>>i&1) cout<<i+1<<" ";
}
cout<<"
";
return ;
}
//不选择pos这个值
dfs(pos+1,tar);
//选择pos这个值
dfs(pos+1,tar|(1 << pos));
}
int main() {
cin >> n;
dfs(0,0);
return 0;
}