实现思路就是对于当前第u位数(u <= n),分为选与不选两种情况,构成了一棵二叉选择树,最终的叶节点就是答案。
为了节省空间和简化操作,使用状态压缩,对于state,第i位为1表示i这个数被选中。
#include<iostream>
using namespace std;
int n;
void dfs(int u, int state) {
if (u == n) {
for (int i = 0; i < n; i++) {
if (state >> i & 1) {
cout << i + 1 << " ";
}
}
cout << endl;
return;
}
dfs(u + 1, state);// 分支:不用这个数
dfs(u + 1, state | 1 << u);//用这个数
}
int main() {
cin >> n;
dfs(0, 0);
return 0;
}