您的位置:首页 > 其它

子集生成模板、

2016-02-05 09:51 169 查看
//子集生成算法:给定一个集合,枚举所有可能的子集。
//为了简单起见,讨论的方法中没有重复元素

//增量构造法
#include<cstdio>
#include<cmath>
void print_subset(int n,int* A,int cur)
{
for(int i = 0 ; i < cur; ++i)    printf("%d",A[i]);
printf("\n");
int s = cur ? A[cur-1]+1 : 0;        //确定当前元素的最小可能值、
for(int i = s; i < n; ++i){
A[cur]=i;
print_subset(n,A,cur+1);    //递归构造子集、
}
}
int main()
{
int A[10],n;                //这种方法只适合求从0~n-1的连续整数的子集
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&A[i]);
print_subset(n,A,0);
}


//位向量法
//构造一个位向量B[i],而不是直接构造子集本身,其中B[i]=1,当且仅当i在自己A中.
void print_subset(int n,int* B,int cur)
{
if(cur==n){
for(int i=0;i<cur;++i)
if(B[i])    printf("%d",i);
printf("\n");
return;
}
B[cur]=1;                        //选第cur个元素
print_subset(n,B,cur+1);
B[cur]=0;                        //不选第cur个元素
print_subset(n,B,cur+1);
}


//二进制表示子集法、
//下面程序输出子集S对应的各个元素
void print_subset(int n,int s)
{
for(int i=0;i<n;++i)
if(s&(1<<i))    printf("%d",i);
printf("\n");
//枚举子集和枚举整数一样
for(int i=0;i<(1<<n);++i)        //枚举各子集对应的编码
print_subset(n,i);
}
//从代码量看,枚举子集的最简单方法是二进制法、
//当用二进制表示子集时,位运算中的按位与、或、异或对应集合的交、并和对称差


要看回溯法了、先巩固一下递归
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: