今晚在刘汝佳的算法竞赛里面学到了子集生成的位向量法,感觉这方法比较直观,只要把递归理解好就ok了,下面是我在看了他的方法之后自己编的求子集的代码,拿出来和大家交流一下,多多指教。
//位向量法,当b[i]=1当且仅当i在子集中
#include<iostream>
#include<cstring>
using namespace std;
int b[20],a[20]; //假设集合的元素最多有20个
void subset(int n,int *a,int *b,int cur)
{
if(cur==n)
{
for(int i=0;i<n;i++)
if(b[i]) cout<<a[i]<<" ";
cout<<endl;
return; //return不能少,否则程序会溢出
}
b[cur]=1; //选择第cur个元素
subset(n,a,b,cur+1);
b[cur]=0;
subset(n,a,b,cur+1); //不选择第cur个元素
}
int main()
{
memset(b,0,sizeof(b));
int num;
cin>>num;
for(int i=0;i<num;i++)
{
cin>>a[i];
}
subset(num,a,b,0);
return 0;
}