码迷,mamicode.com
首页 > 其他好文 > 详细

枚举非空真子集

时间:2018-07-06 01:31:22      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:就是   i++   完整   实现   main   div   col   取值   mes   

第一种情况给定的集合是满状态的,也就是枚举2的n次方种状态下的每一种子集的情况。

for(int x=0;x<(1<<n);x++)

这里的x是一个二进制数,其长度为n,取值为00000...00000~11111...11111的每一种状态。

for(int i=0;i<n;i++)
        if(x&(1<<i))

这里的i的取值为1,10,100,1000,10000...其目的就是一个一个去试x中对应位置的元素是1还是0,如果是1表示当前集合中有这个元素,否则没有。

第二种情况给定的集合不一定是满状态的,这时要输入一个全集s。

for(int x=s;x;x=s&(x-1))

这里的x就是s的子集的一种情况了,后面的i还是类似签名的道理,一位一位地去试有没有当前这个元素。

完整实现如下,首先输入全集元素个数n,进行一次枚举,接下来输入给定集合s进行子集的枚举,这是两种枚举情况的举例。

#include<iostream>
using namespace std;
int n,s;
int main()
{
    cin>>n;
    for(int x=0;x<(1<<n);x++)
    {
        for(int i=0;i<n;i++)
        if(x&(1<<i))
            cout<<i+1<<" ";
        cout<<endl;
    }
    cin>>s;
    for(int x=s;x;x=s&(x-1))
    {
        for(int i=0;i<n;i++)
        if(x&(1<<i))
            cout<<i+1<<" ";
        cout<<endl;
    }
    return 0;
}

 

枚举非空真子集

标签:就是   i++   完整   实现   main   div   col   取值   mes   

原文地址:https://www.cnblogs.com/aininot260/p/9270794.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!