《算法竞赛入门经典》-7.3-子集生成

来源:互联网 发布:linux 限制用户登录 编辑:程序博客网 时间:2024/05/17 12:06

一.二进制法:
①表示{0,1,2,……,n - 1}的子集S
②为了处理方便,最右边的位总是对应元素0,而不是元素1
③与、或和异或都满足交换律:
A & B = B & A
A | B = B | A
A ^ B = B ^ A
④A & B,A | B,A ^ B分别对应集合的交、并和对称差
⑤为了方便,往往在程序中把全集定义成u_set = (1 << n) - 1,则A的补集就是u _set ^ A
代码实现:

int n,a[101];//n为元素个数void print_subset(int s)//s代表着一个子集{    for(int i = 0; i <= n - 1; ++i)        if(s & (1 << i))//如果s的第i位(从0开始数)上是1            printf("%d ",a[i]);//打印    printf("\n");}int main(){    //输入    cin >> n;    for(int i = 0; i <= n - 1; ++i)        scanf("%d",&a[i]);    for(int i = 0; i <= (1 << n) - 1; ++i)        print_subset(i);//打印每个子集    return 0;}
原创粉丝点击