您的位置:首页 > 其它

子集生成

2016-08-31 10:17 190 查看
//2016.8.31
#include <iostream>
#include <cstdio>

using namespace std;

void print_subset(int n, int *a, int cur)//增量构造法
{
for(int i = 0; i < cur; i++)cout<<a[i];//打印当前集合,即选出的元素序号
cout<<endl;
int tmp = cur?a[cur-1]+1:0;//确定当前元素的最小可能值
for(int i = tmp; i < n; i++)
{
a[cur] = i;
print_subset(n, a, cur+1);//递归构造子集
}
}

void print_subset2(int n, int *b, int cur)//位向量法
{
if(cur==n){//打印
for(int i = 0; i < n; i++)
if(b[i])cout<<i;
cout<<endl;
return ;
}
b[cur] = 1;//选择第cur个元素
print_subset2(n, b, cur+1);
b[cur] = 0;//不选择第cur个元素
print_subset2(n, b, cur+1);
}

void print_subset3(int n)//二进制法,A&B,A|B,A^B分别对应集合A和B的交、并、对称差
{
for(int s = 0; s < (1<<n); s++){
for(int i = 0; i < n; i++)
if(s&(1<<i))cout<<i;
cout<<endl;
}
}

int main()
{
int a[4], b[4];
print_subset(4, a, 0);
cout<<"--------------------------------------"<<endl;
print_subset2(4, b, 0);
cout<<"--------------------------------------"<<endl;
print_subset3(4);
return 0;
}

 

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