</pre><pre name="code" class="cpp">#include<iostream>
using namespace std;
typedef struct{
int list[20];
int len;
}List;
int GetPowerSet(int i,List a, List &b)
{//第i轮循环,递归
if(i>=a.len)
{//若到了状态树的叶子节点,输出,该轮结果
cout<<"{";
for(int cn = 0;cn<b.len;cn++)
cout<<b.list[cn]<<",";
cout<<"}"<<endl;
return 1;
}
else
{//每到叶子节点,继续构造状态树,向下延伸
int x = a.list[i];
int k = b.len;
b.list[k] = x;
b.len++;//将a.list[i]存入b集合,长度加1
GetPowerSet(i+1,a,b);//取a.list[i]
b.len--;//因为每次运行到此语句都是状态树的回溯,故要b的长度减1,表示舍去上面最后一个元素。
GetPowerSet(i+1,a,b);//舍a.list[i]
}
}
int main(void)
{
List a;
a.len = 3;
for(int cn = 0;cn<a.len;cn++)
{
a.list[cn]=cn+1;
cout<<a.list[cn];
}//集合a
cout<<endl;
List b;//集合b存放每轮循环的幂集结果
b.len = 0;
GetPowerSet(0,a,b);
}
回溯法-幂集
最新推荐文章于 2022-11-10 17:52:54 发布