AcWing 92. 递归实现指数型枚举
题面:从
这 个整数中随机选取任意多个,输出所有可能的选择方案(求子集)。
目录:
1. 使用dfs树的解法
层级既代表递归深度也代表当前数字,左子树为选该层数字,右子树为不选。
#include <bits/stdc++.h> using namespace std; const int N = 1010; int n; bool st[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); }
2. 使用二进制与状态压缩的解法
为什么要采用二进制?
二进制每一位的0和1可以表示一个二元状态集合;
而二进制本身又表示一个整数,即可以用整数的加减表示状态之间的转移。
压缩:将一个集合压缩成了一个整数(整数作为数组下标)。
位运算的几个注意点:
① 左移乘二,右移除二;
② &
与判定是否为1,|
异或将该位设为1。
#include <bits/stdc++.h> using namespace std; const int N = 1010; int n; void dfs(int u, int st) { if (u > n) { //达到最大递归深度 for (int i = 1; i <= n; i++) if (st >> i & 1) //st的第i位若为1 cout << i << " "; cout << endl; return; } dfs(u + 1, st | 1 << u); //选,把第u位变成1 dfs(u + 1, st); //不选,进入下一步递归 } int main() { cin >> n; dfs(1, 0); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!