您的位置:首页 > 其它

子集生成(三种办法)

2016-09-12 20:39 232 查看
下面附上三种生成子集的算法代码,来自算法竞赛入门经典

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
#define ll long long
const int INF=0x7fffffff;
const int N=100000+2;
int n,A[16],B[16];
void dfs1(int cur)
{ //增量构造法
int i;
for (i=0;i<cur;i++)
printf("%d ",A[i]);
printf("\n");
int s=cur?A[cur-1]+1:1;
for (i=s;i<=n;i++)
{
A[cur]=i;
dfs1(cur+1);
}
}
void dfs2(int cur)
{ //位向量法
int i;
if (cur==n+1)
{
for (i=1;i<cur;i++)
if (B[i])
printf("%d ",i);
printf("\n");
return;
}
B[cur]=1;
dfs2(cur+1);
B[cur]=0;
dfs2(cur+1);
}
void dfs3(int cur)
{ //二进制法
int i;
for (i=0;i<n;i++)
if (cur&(1<<i))
printf("%d ",i);
printf("\n");
}
int main()
{
int i;
scanf("%d",&n);
//dfs1(0);
//dfs2(1);
for (i=0;i<(1<<n);i++)
dfs3(i);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: