递归实现的三种枚举

简介: 递归实现的三种枚举

1.指数型枚举:1~n里选任意个的所有情况:

     通过数组记录每个数字的选择情况:未决定,选,不选

       对没选过的数,可以直接选或者不选,所以往选和不选两个方向递归

       递归参数是当前要做选择的数

void dfs(int x){
    if(x > n){
        for(int i = 1;i <= n;i++){
            if(f[i] == 2) cout << i << " ";
        }
        puts("");
        return;
    }
    f[x] = 2;
    dfs(x+1);
    // f[x] = 0;
    f[x] = 1;
    dfs(x+1);
    // f[x] = 0;
}

2.组合型枚举

       1~n里·选m个的所有情况

       bool数组记录选择情况

       没选过就选

       //通过保证递增来保证枚举的情况不和之前的情况重复

       递归参数写当前在选第几个数

void dfs(int x){
    if (x + n - (f[x-1]+1) < m) return;
    // 剪枝:凑不齐m个数了
    if(x > m){
        for(int i = 1;i <= m;i++){
            cout << f[i] << " ";
        }
        puts("");
        return ;
    }
    for(int i = f[x-1]+1;i <= n;i++){//通过保证递增来保证枚举的情况不和之前的情况重复
        if(!st[i]){
            f[x] = i;
            st[i] = true;
            dfs(x+1);
            f[x] = 0;
            st[i] = false;
        }
    }
}

3.排列型枚举

       bool数组记录选不选当前情况,递归时没选过就直接选

       递归不用保证递增

void dfs(int x){
    //dfs到达边界
    if(x > n){
        for(int i = 1;i <= n;i++){
            cout << f[i] << " ";
        }
        puts(" ");
        return;
    }
    //dfs 开始枚举分支
    for(int i = 1;i <= n;i++){
        if(!st[i]){
            st[i] = true;
            f[x] = i;
            dfs(x+1);
            st[i] = false;
            // f[i] = 0;dfs的回溯流程,但在代码层面无实际意义
        }
    }
}
目录
相关文章
|
6月前
【洛谷 P2089】烤鸡(循环枚举)
烤鸡问题探讨了如何组合10种配料达成特定美味程度。给定正整数$n$代表美味程度,程序需列出所有使得配料总和等于$n$的方案。样例输入11对应10种配料的不同组合,输出显示了10种符合条件的方案。代码通过暴力枚举实现,AC代码展示了如何遍历所有可能的配料质量组合来找到答案。对于100%的数据,$n\leq5000$。
64 0
|
7月前
|
存储 算法 测试技术
位运算、状态压缩、枚举子集汇总
位运算、状态压缩、枚举子集汇总
|
7月前
|
人工智能 测试技术
【位运算 状态压缩 枚举子集】1178. 猜字谜
【位运算 状态压缩 枚举子集】1178. 猜字谜
|
7月前
|
C语言
二分查找法的区间判断【C语言】
二分查找法的区间判断【C语言】
|
7月前
函数参数传双指针
函数参数传双指针
|
算法 测试技术 C#
C++二分查找算法:132 模式解法二枚举2
C++二分查找算法:132 模式解法二枚举2
|
算法
使用遍历方法和分治法求两个数组的值
看似简单的姐数组中的最大值实际上体现了不同的思路本文将以比较数组大小为背景,分别展示普通算法和分治法,通过对比来简述分治法。 问题描述 给定一个整数数组,编写一个算法来找到数组中的最大值和最小值。
80 0
|
C语言
【C语言】在有序数组中查找某个特定的值(二分查找法)
【C语言】在有序数组中查找某个特定的值(二分查找法)
194 0
递归实现组合型枚举
递归实现组合型枚举
48 0