递归实现的三种枚举

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

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的回溯流程,但在代码层面无实际意义
        }
    }
}
目录
相关文章
|
5月前
【洛谷 P2089】烤鸡(循环枚举)
烤鸡问题探讨了如何组合10种配料达成特定美味程度。给定正整数$n$代表美味程度,程序需列出所有使得配料总和等于$n$的方案。样例输入11对应10种配料的不同组合,输出显示了10种符合条件的方案。代码通过暴力枚举实现,AC代码展示了如何遍历所有可能的配料质量组合来找到答案。对于100%的数据,$n\leq5000$。
51 0
|
6月前
|
C语言
二分查找法的区间判断【C语言】
二分查找法的区间判断【C语言】
|
11月前
递归实现排列型枚举
递归实现排列型枚举
|
11月前
|
算法 测试技术 C#
C++二分查找算法:132 模式解法二枚举2
C++二分查找算法:132 模式解法二枚举2
|
11月前
|
算法 程序员 C#
C++二分查找算法:132 模式枚举3
C++二分查找算法:132 模式枚举3
|
存储 算法 容器
精选算法题(1)——枚举符合要求的算术表达式(DFS、回溯法)
精选算法题(1)——枚举符合要求的算术表达式(DFS、回溯法)
递归实现组合型枚举
递归实现组合型枚举
40 0
|
算法 C语言 C++
[c语言]二叉树 非递归算法(先中后遍历)
1.定义头文件加结构体变量 2.创建一棵树 3.初始化栈 4.头插法入栈 5.判断栈是否为空 6.出栈操作 7.先序遍历 8.中序遍历 9.后序遍历 10.主函数调用 11.运行结果:
156 1