本篇用A[i]表示A数组中第i个元素表示的是原数组中第i个下标。
第一种方法:增量构造法
void fun1(gg cur,gg A[])
//生成子集的第一种方法,增量构造法
{
for(int i=0;i<cur;i++)
{
cout<<vi[A[i]]<<" ";//A[i]是下标,所以输出的时候把输入数组加上
}
cout<<"\n";
int s = cur?A[cur-1]+1:0;//这里因为当前cur已经是+1过的,所以要-1在加一个下标。
for(int i=s;i<n;i++)
{
A[cur]=i;
fun1(cur+1,A);
}
}
第二种方法:位向量法
基本思想是对于每一个元素,我可以选择加入序列,也可以选择不加如序列,当cur==n时,就输出选择的序列,B[i]=1表示当前元素已被选择。
void fun2(gg cur,gg B[])
{
if(cur==n)
{
for(int i=0;i<n;i++)
{
if(B[i]) cout<<vi[i]<<" ";
}
cout<<"\n";
return;
}
//对于每一个当前cur,我可以选择选,也可以选择不选
B[cur]=0;
fun2(cur+1,B);
B[cur]=1;
fun2(cur+1,B);
}