92. 递归实现指数型枚举
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了92. 递归实现指数型枚举相关的知识,希望对你有一定的参考价值。
92. 递归实现指数型枚举
https://www.acwing.com/problem/content/description/94/
题解:
先画一个递归树分析。我们可以知道的是每个数我们都有选或不选两种选择。
我们画一个当n=3时的递归树。
那么我们如何用代码实现呢?
我们可以写一个函数 dfs(int n) 其中 n代表的是当前第几个数的判断。
例如 dfs(0) (数组的下标默认是0) 代表的是第一个元素的判断 即选还是不选。
当我们判断的 数的个数达到n说明已经判断完了。就输出,return。
我们还得用一个数组来保存每个数的状态。 0代表还没有判断(或考虑),1代表选了,2代表不选。
那么代码如下:
#include<cstdio>
#include<iostream>
int a[20]; // 0代表还没考虑 1代表选 2代表不选
int n;
void dfs(int w)//代表当前选的是第个数
{
if(w==n)
{
for(int i=0;i<n;i++)
{
if(a[i]==1)
printf("%d ",i+1);
}
printf("\\n");
return;
}
a[w]=2;//该数不选
dfs(w+1);//判断下一个数
a[w]=0;//恢复现场
a[w]=1;//该数选
dfs(w+1);//判断下一个数
a[w]=0;//恢复现场。
}
int main(void)
{
scanf("%d",&n);
dfs(0);
return 0;
}
那么啥是恢复现场呢?
有的人不习惯从0开始。那么我们就写一个下标从1开始的。
#include<cstdio>
#include<iostream>
int a[20]; // 0代表还没考虑 1代表选 2代表不选
int n;
void dfs(int w)//代表当前选的是第个数
{
if(w>n)
{
for(int i=1;i<=n;i++)
{
if(a[i]==1)
printf("%d ",i);
}
printf("\\n");
return;
}
a[w]=2;
dfs(w+1);
a[w]=0;
a[w]=1;
dfs(w+1);
a[w]=0;
}
int main(void)
{
scanf("%d",&n);
dfs(1);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[30],vis[30],n;
void dfs(int index)
{
if(index==n)
{
for(int i=0;i<n;i++) if(vis[i]==1) cout<<i+1<<" ";
cout<<endl;
return;
}
vis[index]=1;
dfs(index+1);
vis[index]=0;
dfs(index+1);
}
int main(void)
{
cin>>n;
dfs(0);
return 0;
}
注意: 递归一定要恢复现场。
以上是关于92. 递归实现指数型枚举的主要内容,如果未能解决你的问题,请参考以下文章
《算法竞赛进阶指南》-AcWing-92. 递归实现指数型-题解