二进制法枚举子集

通过转换为二进制来查找是否存在子集。其中&的结果是2个集合的子集,| 表示2个子集的并集,^ 表示2个集合中不同元素的集合

#include<cstdio>
using namespace std;
void print_subset(int n,int s)
{
    for(int i=0; i<n; i++)
        if(s&(1<<i)) printf("%d ",i);///s&(1<<i),表示s与1左移i位的所形成的二进制数有没有交集
    printf("\n");
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0; i<(1<<n); i++)
            print_subset(n,i);
    }
    return 0;
}