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. 递归实现指数型枚举的主要内容,如果未能解决你的问题,请参考以下文章

ACwing92 递归实现指数型枚举 dfs

AcWing 92. 递归实现指数型枚举

《算法竞赛进阶指南》-AcWing-92. 递归实现指数型-题解

《算法竞赛进阶指南》-AcWing-92. 递归实现指数型-题解

递归实现指数型 / 组合型 / 排列型枚举

递归实现组合型指数型排列型 枚举