93. 递归实现组合型枚举逐行代码解析

本文详细介绍了如何使用C++中的深度优先搜索(DFS)递归算法解决组合型枚举问题,以AcWing题库中的一个问题为例,展示了如何在给定限制条件下选择合适的数字并输出结果。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
const int N=30;//way[u]其中u最大为30,u是代表第几个数
int n,m;//从n中选择m个数
int way[N];

void dfs(int u,int start)
{
    //额外补充:剪纸操作,例如当 4 占据第一个位置的时候实际上已经可以不用进行操作了
    //公式:1.已经使用了u-1个数 距离n也就是数的上限还差 n-start+1
    //      2.u-1+n-start+1<m 的时候就应该进行剪枝操作了
    if(u+n-start<m) return;
    if(u-1==m)//u-1代表已经选取了u-1个数恰好等于m的时候,就可以返回结果了
    {
        for(int i=1;i<=m;i++)
        {
            cout<<way[i]<<" ";
        }
        cout<<endl;
    }
    //进行递归操作
    for(int i=start;i<=n;i++)
    {
        way[u]=i;
        dfs(u+1,i+1);//下一个要使用的u就是u+1;start从i+1开始
        way[u]=0;
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    dfs(1,1);//第二个也就是start记录了开始的数字
    return 0;
}

93. 递归实现组合型枚举 - AcWing题库

方法来自y总

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值