可以用递归法,也可以用二进制对比法
递归法可以想象成二叉树,可选择的状态选项只有2个,有这个元素和没有这个元素,先一条道走到头,然后回溯一步,再走到头...也就是回溯法。
递归法代码如下:
void GetsubSet(int set[],bool have[],int length,int deepth = 0)
{
if(length == deepth)
{
cout << "{";
for(int i = 0; i < length; i++)
{
if(have[i]) cout << set[i] << ","; //如果有这个元素,则输出
}
cout <<"}"<<endl;
}
else
{
have[deepth] = false; //分别列出两种状态分别深入递归
GetsubSet(set, have, length,deepth + 1);
have[deepth] = true;
GetsubSet(set, have, length,deepth + 1);
}
}
二进制法代码如下:
void GetsubSetB(int set[],int length)
{
long n = pow((float)2,length);
for(int i = 0; i < n; i++)
{
cout << "{" ;
int temp = i;
for(int j = 0; j < length; j++)
{
if(temp & 1) cout << set[j] << ",";
temp = temp >> 1;
}
cout << "}" << endl;
}
}