任意N个数的子集生成算法
Posted Kuro同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任意N个数的子集生成算法相关的知识,希望对你有一定的参考价值。
第一种方法:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int q[100];
int w[100];
int cmp(int a,int b)
return a<b;
void subset(int cur,int end)
int i;
for(i=0;i<cur;i++)
printf("%d",w[i]);
cout<<endl;
for(i=cur;i<end;i++)
w[cur]=q[i]; //赋值
if(i!=0&&w[cur]<=w[cur-1]) //避免相同元素和重复
continue;
subset(cur+1,end);
int main()
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&q[i]);
sort(q,q+n,cmp); // 必须先排序
subset(0,n);
return 0;
第二种方法:位向量法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int q[100];
int vis[100];
void subset(int cur,int end)
int i,j,n;
if(cur==end) //必须给所有向量赋值才能输出
for(i=0;i<cur;i++)
if(vis[i]) //向量为1则输出
printf("%d",q[i]);
cout<<endl;
return; //别忘了。。。
vis[cur]=1;
subset(cur+1,end);
vis[cur]=0;
subset(cur+1,end);
int main()
int end;
scanf("%d",&end);
for(int i=0;i<end;i++)
scanf("%d",&q[i]);
subset(0,end);
return 0;
以上是关于任意N个数的子集生成算法的主要内容,如果未能解决你的问题,请参考以下文章