蓝桥杯——1.5递归实现组合型枚举

题目描述:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nTbIbo4J-1637490638968)(C:\Users\33385\AppData\Roaming\Typora\typora-user-images\image-20211121182923419.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gw2rfny1-1637490638972)(C:\Users\33385\AppData\Roaming\Typora\typora-user-images\image-20211121182936082.png)]

AC代码

// 动态数组的dfs,好理解
/*
我们只需要基于之前的模板,加上超过了m个数
的特判和剩下的数不足m的剪枝两个操作,就很
好理解了
*/
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int n, m;

vector<int> path;

void dfs(int u)
{
    
    
    if (path.size() > m || path.size() + (n - u + 1) < m)// 条件特判和剪枝
       return ;
       
    if (u == n + 1)                 // 递归达到了终点
    {
    
    
        for (int i = 0; i < path.size(); i ++)
            cout << path[i] << " ";
        cout << endl;
        return ;
    }
    
    // 选
    path.push_back(u);
    dfs(u + 1);
    
    // 恢复现场
    path.pop_back();
    
    // 不选
    dfs(u + 1);
}

int main()
{
    
    
    cin >> n >> m;
    
    dfs(1);
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_57095511/article/details/121457622