//子集生成
//增量构造法---一次选一个数放入集合中
void print(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++){//以当前最小可能值为起点到n-1均满足条件
A[cur]=i;//填充
print(n,A,cur+1);//又找cur+1的当前最小可能值
}
}
int A[10];
int main(){
print(5,A,0);
system("pause");
return 0;
}
//位向量法---要或者不要这个数
void print_subset(int n,int*B,int cur){
if(cur==n){//但选择完了以后就进行一次输出
for(int i=0;i<cur;i++)if(B[i]==1)printf("%d ",i);
printf("\n");
return ;
}
B[cur]=1;//进行选择,要或者不要
print_subset(n,B,cur+1);
B[cur]=0;
print_subset(n,B,cur+1);
}
int B[10];
int main(){
print_subset(5,B,0);
system("pause");
return 0;
}
//二进制法
#include<stdio.h>
#include<stdlib.h>
#include<algo
关于生成子序列的常用方法
最新推荐文章于 2022-03-16 19:07:37 发布