每日一题——递归实现指数型枚举
题目
题解
由于书本的顺序,刚做完第一章可能会联想到用位运算这样的手法来遍历所有状态,因为他的范围不大,所以理论可以实现。但是题目要求用递归思路,所以我们用递归思路写一遍,递归有两条路往下,选当前位置和不选当前位置,我们不能一边输出一边选,这样会导致输出混乱,可以拿个数组来记录当前操作是否选择了该数字,选完之后记得恢复原来没选的状态,最后遍历输出即可。位运算就当扩展。
参考代码(递归)
#include<iostream>
using namespace std;
const int N = 20;
int n;
bool st[N];
void dfs(int u){
if(u > n){
for(int i = 1;i <= n; i ++)
if(st[i]) cout << i << " ";
puts("");
return;
}
//选
st[u] = true;
dfs(u + 1);
st[u] = false;
//不选
dfs(u + 1);
}
int main(){
cin >> n;
dfs(1);
return 0;
}
参考代码(位运算)
#include<iostream>
using namespace std;
int n;
void f(int n){
for(int i = 0; i < 1 << n; i ++){
for(int j = 0; j <= n; j ++){
if((i >> j) & 1) cout << j + 1 << " ";
}
puts("");
}
}
int main(){
cin >> n;
f(n);
return 0;
}

浙公网安备 33010602011771号