實現思路就是對於當前第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;
}