每日一题——递归实现指数型枚举

题目

递归实现指数型枚举

题解

由于书本的顺序,刚做完第一章可能会联想到用位运算这样的手法来遍历所有状态,因为他的范围不大,所以理论可以实现。但是题目要求用递归思路,所以我们用递归思路写一遍,递归有两条路往下,选当前位置和不选当前位置,我们不能一边输出一边选,这样会导致输出混乱,可以拿个数组来记录当前操作是否选择了该数字,选完之后记得恢复原来没选的状态,最后遍历输出即可。位运算就当扩展。

参考代码(递归)

#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;
}
posted @ 2025-03-05 18:59  PZnwbh  阅读(19)  评论(0)    收藏  举报