子集枚举的二进制(位运算)方法

何为枚举,假设有n个物品,那么对每一种物品,你都有选或不选两种情况,所以总共有2^n种情况,这就对应于求一个有n个元素的集合的子集,那么子集的个数就有2^n个。

这里我们知道每一个数字都可以由唯一的二进制串表示,我们对应于上面的情况,让1代表取物品的情况,0表示不取物品的情况。
这样一来就有了用二进制枚举子集的方法。

这里采用了位运算主要是表达简单,且速度快

#include  <bits/stdc++.h>
int a[5] = {1, 3, 5, 6, 8};
void print_subset(int n, int s) {
    for(int i = 0; i < n; i++) {
        if(s & (1 << i)) printf("%d ", a[i]);
    }
    printf("\n");
}
int main() {
    int n = 5;
    for(int i = 0; i < (1 << n); i++) {
        print_subset(n, i);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80243846