原题链接:92. 递归实现指数型枚举
解题思路
这等价于每个整数可以选可以不选,所有可能的方案总数有2的n次方种,通过前两节的学习我们已经知道可以进行一次循环,利用位运算来列举所有的选择方案。这一次我们使用递归来求解,在每一次递归中分别尝试某个数“选”还是“不选”两条分支,将尚未确定的整数数量减少1,从而转化为一个规模更小的同类问题。
样例代码
#include <iostream>
using namespace std;
vector<int> chosen;
void calc(int x) {
if(x == n+1) { //边界问题
for(int i = 0;i < chosen.size(); i++)
pritnf("%d ", chosen[i]);
puts("");
return;
}
//“不选x”分支
calc(x+1);
//“选x”分支
chosen.push_back(x);//记录x已经被选择
calc(x+1);//求解子问题
chosen.pop_back();//准备回溯到上一个问题之前,还原现场
}
int main(){
calc(1);//主函数中的调用入口
}