您的位置:首页 > 其它

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

2017-08-26 19:49 134 查看
一.二进制法:

①表示{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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: