代码:
#include<iostream> #include<cstring> 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)//state的第i位是否为1 cout << i + 1 <<" "; cout << endl; return; } dfs(u + 1, state);//不用这个数 dfs(u + 1, state | 1 << u);//用这个数 state的第u位置为1 } int main() { cin >> N; dfs(0, 0); return 0; }
#include<iostream> #include<cstring> #include<vector> using namespace std; //从前往后 选或者不选 int N; //时间复杂度 2^n 2^15=3W void dfs(int u, int state) { if (u == N)//当枚举到第N个数的话,所有的数已经枚举完了 { for (int i = 0; i < N; i++) { if (state >> i & 1)//state的第i位是否为1,用位运算记录状态 cout << i + 1 << " "; } cout << endl; return; } dfs(u + 1, state); dfs(u + 1, state | 1 << u);//state的第u位置成1 } int main() { cin >> N; dfs(0, 0);//枚举到了第几个数 表示哪些数已经被用过了 return 0; }