子集生成(位运算法)

紫书的方法真是太秒啦,尤其是s&1<<i这个操作,真是秀我一脸,利用<<优先级比&高,来判断s的第i位是否为1,真是太妙了!

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

void print_subset(int n, int s) {
    for(int i = 0; i < n; ++i)
        if(s & 1 << i)//1右移几位就代表第i个二进制位为1,其他位为0,与状态进行&运算,如果此状态包含该数字,就输出
            printf("%d ", i);
    printf("\n");
}

int main() {
    int n;
    while(scanf("%d", &n) == 1) {
        for(int i = 0; i < (1 << n) ; ++i)//一共1<<n种可能排列方式
            print_subset(n, i);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Endeavor_G/article/details/88598207
今日推荐