子集生成算法
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.
一次选出一个元素放到集合中
示例程序:
#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.
相关文章推荐