/*
* 集合{1,2,3,4,5,8} 中找到所有和为 10的子集
*/
#include <iostream>
using namespace std;
int main()
{
int array[] = {1,2,3,4,5,8};
int mask = 1;
int index = 0;
int sum = 0;
for(int i=0; i<64/* 2^6 = 64*/;i++)
{
mask = 1;
index = 0;
sum = 0;
for(int j=0; j<6; j++)
{
index = mask&i;
if(0!=index)
{
sum+=array[j];
}
mask<<=1;
}
if(10==sum)
{
//输出
mask = 1;
for(int j=0; j<6; j++)
{
index = mask&i;
if(0!=index)
{
cout<<array[j]<<" ";
}
mask<<=1;
}
cout<<endl;
}
}
system("pause");
return 0;
}
结果:
1 2 3 4
2 3 5
1 4 5
2 8
遍历所有子集算法的核心思想是 将一个集合中每一个子集用一个数字的二进制形式表示 集合中的一个元素与二进制数的一位相对应 有该元素 该位就为1 否则为0 那么全部子集就对应了 0~(2^N-1) 连续的2^N个数 遍历算法就显而易见了 用与操作(&)可以判断特定位的值
本文介绍了一种使用位运算的方法来找出指定集合中所有元素和等于特定数值(本例中为10)的子集。通过将每个可能的子集与原始集合进行按位比较,可以有效地枚举所有可能的组合。
5282

被折叠的 条评论
为什么被折叠?



