枚举非空真子集
Posted aininot260
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举非空真子集相关的知识,希望对你有一定的参考价值。
第一种情况给定的集合是满状态的,也就是枚举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; }
以上是关于枚举非空真子集的主要内容,如果未能解决你的问题,请参考以下文章
在 C 中,何时支持有条件的“测试?:替代”形式(空真大小写)? [复制]