您的位置:首页 > 其它

子集生成算法

2015-03-01 23:49 239 查看
方法一:增量构造法

一次选出一个元素放到集合中

示例程序:

#include<iostream>

using namespacestd;



void print(intn,int *A,int cur);



int main()

{

int A[90];

print(5,A,0);

return 0;

}



void print(intn,int *A,int cur)

{

for(int i=0;i<cur;i++)//打印当前集合

{

cout<<A[i]<<" ";

}

cout<<endl;

int s=cur?A[cur-1]+1:0;//确定当前元素的最小可能值

for(int i=s;i<n;i++)

{

A[cur]=i;

print(n,A,cur+1);//递归构造子集

}

}

运行结果:



0

0 1

0 1 2

0 1 2 3

0 1 2 3 4

0 1 2 4

0 1 3

0 1 3 4

0 1 4

0 2

0 2 3

0 2 3 4

0 2 4

0 3

0 3 4

0 4

1

1 2

1 2 3

1 2 3 4

1 2 4

1 3

1 3 4

1 4

2

2 3

2 3 4

2 4

3

3 4

4

方法二:位向量法

构造一个位向量B[i],当且仅当B[i]==1时,i在子集A中,输出A的元素。

示例程序:

#include<iostream>

using namespacestd;



void print(intn,int *B,int cur);



int main()

{

int B[90];

print(5,B,0);

cout<<"THE END.";

}



void print(intn,int *B,int cur)

{

if(cur==n)

{

for(int i=0;i<cur;i++)

{

if(B[i])

{

cout<<i<<"";

}

}

cout<<endl;

return ;

}

B[cur]=1;

print(n,B,cur+1);

B[cur]=0;

print(n,B,cur+1);

}

运行结果:

0 1 2 3 4

0 1 2 3

0 1 2 4

0 1 2

0 1 3 4

0 1 3

0 1 4

0 1

0 2 3 4

0 2 3

0 2 4

0 2

0 3 4

0 3

0 4

0

1 2 3 4

1 2 3

1 2 4

1 2

1 3 4

1 3

1 4

1

2 3 4

2 3

2 4

2

3 4

3

4



THE END.

方法三:二进制法



示例程序:

#include<iostream>

using namespacestd;



void print(intn,int s);



int main()

{

for(int i=0;i<(1<<5);i++)//枚举各子集对应的编码:0,1,2,……,2^n-1

{

print(5,i);

}

cout<<"THE END.";

}



void print(intn,int s)//打印0,1,2,……n-1的子集S

{

for(int i=0;i<n;i++)

{

if(s&(1<<i))

{

cout<<i<<" ";

}

}

cout<<endl;

}

运行结果:



0

1

0 1

2

0 2

1 2

0 1 2

3

0 3

1 3

0 1 3

2 3

0 2 3

1 2 3

0 1 2 3

4

0 4

1 4

0 1 4

2 4

0 2 4

1 2 4

0 1 2 4

3 4

0 3 4

1 3 4

0 1 3 4

2 3 4

0 2 3 4

1 2 3 4

0 1 2 3 4

THE END.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: