此文写于2017年11月26日、
DFS子集
什么是子集
子集就是:
比如一个123
它的子集就是:
①空
②1
③2
④3
⑤1 2
⑥1 3
⑦2 3
⑧1 2 3
那么怎样写代码让它输出这些呢?
代码实现
这里介绍一种二进制法。
#include<cstdio>
#include<algorithm>
using namespace std;
const int MN=1005;
int n,a[MN];
bool dis[MN];
void print()
{
for(int i=1;i<=n;i++)
if(dis[i]) printf("%d ",a[i]);
printf("\n");
}
void dfs(int x)
{
if(x>n)
{
print();
return ;
}
dis[x]=0;
dfs(x+1);
dis[x]=1;
dfs(x+1);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dfs(1);
return 0;
}
我来解释一下:
假设开始是123
每种数都有取或者不取两种选择.
所以三个数就有八种情况。
那么如上