回溯法-幂集

</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);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值