每日算法打卡:递归实现组合型枚举 day 4

news2025/6/9 14:46:20

文章目录

    • 原题链接
    • 题目描述
        • 输入格式
        • 输出格式
        • 数据范围
        • 输入样例:
        • 输出样例:
    • 题目分析
    • 示例代码
    • 优化

原题链接

93. 递归实现组合型枚举

题目难度:简单

题目来源:《算法竞赛进阶指南》

题目描述

从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。

输入格式

两个整数 n,m 在同一行用空格隔开。

输出格式

按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。

数据范围

n>0 ,
0≤m≤n ,
n+(n−m)≤25

输入样例:
5 3 
输出样例:
1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

思考题:如果要求使用非递归方法,该怎么做呢?

题目分析

这道题和我们之前做到指数类型枚举和排列类型枚举有一定的相关性

组合类型的枚举指的是从n个数中选取m个数,不考虑顺序

首先考虑在手算情况下是如何确保不重不漏的枚举出所有情况的,例如从1到5这5个数字中选取3个数字,一种比较容易想到的方法就是,优先取最小的数字填入左边的两个空位,第三个空位依次枚举,枚举完成之后,换掉第二个位置的数字,依次枚举

这里就出来一个问题,如何保证这样的枚举方式是不重不漏呢,主要是重复的问题,其实只需要确保每次选择数字时,选择的数字比前一个数字大即可,这样就可以保证序列一定是升序的,并且没有重复的数字

那么想要使用递归来实现这个过程,就需要把他转换成树的形式

同样是5选3

屏幕截图 2024-01-04 102410.png

这里可以发现,按照一开始确定的后选的数字要比前选的数字大的规定,第一个位置填4和5实际上是不符合情况的

在画完递归搜索树之后,要将其转化为代码,核心思想其实就在于需要传入什么样的参数,当然这里的参数可能是作为全局变量的直接使用的,有些参数则需要自己手动传入,对于递归函数参数设计其实就是经验问题了

具体到这个问题上,首先需要知道三个位置的状态(是否填入数字以及填入的数字是几),可以通过开一个数组来记录,其次需要知道,当前应该选择哪个位置的数据,只需要传入一个变量即可,最后需要知道还有哪些数字可以被选择,可以传入一个数值,代表当前可以从这个数开始枚举

示例代码

#include<iostream>
using namespace std;

const int N = 30; // 数据范围

int n, m;
int state[N]; // 状态数组,用于记录方案

void dfs(int cur, int start) // 表示当前应该枚举第cur个位置的数字,可以选择大于等于start的数字
{
    if (cur + n - start < m)
        return; // 优化
    if (cur > m) // 边界情况,当已经选择了m个数
    {
        // 输出结果
        for (int i = 1; i <= m; i++)
            cout << state[i] << ' ';
        cout << '\n';
        return;
    }

    for (int i = start; i <= n; i++)
    {
        state[cur] = i; // 选择数据
        dfs(cur + 1, i + 1); // 递归
        state[cur] = 0; // 恢复原状
    }
}

int main()
{
    cin >> n >> m;
    dfs(1, 1); // 表示从第1个位置开始枚举,可以选择大于等于1的数字
    return 0;
}

优化

我们在之前分析的时候发现,有些情况是可以直接忽略而不用进行递归的,我们选择的数字是从start到n的,如果当start到n的所有数字都选上也不够要求的剩下空位个数字,就是不符合情况,可以特判直接退出的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1355158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电动汽车BMS PCB制板的技术分析与可制造性设计

随着电动汽车行业的迅猛发展&#xff0c;各大厂商纷纷投入巨资进行技术研发和创新。电动汽车的核心之一在于其电池管理系统&#xff08;Battery Management System, BMS&#xff09;&#xff0c;而BMS的心脏则是其印刷电路板&#xff08;PCB&#xff09;。通过这篇文章探讨电动…

百度Apollo:激光雷达检测技术深度解析

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式&#xff1a;通过连接报名观看课程&#xff0c;即可免费获取精美周边 ⛳️活动链接&#xf…

prometheus grafana nginx 安装配置和使用

文章目录 前传prometheus exporter容器监控nginxnginx需要加载stub_status监控查看有没有&#xff0c;如果有&#xff0c;去配置下nginx重要&#xff0c;需要重启nginx测试监控是否成功 prometheus中添加nginx-exporter配置 grafana外传 前传 prometheus grafana的安装使用&am…

防爆气象站跟传统气象站相比有哪些优势?

防爆气象站是一种特殊的气象站&#xff0c;设计用于在易燃易爆、高温、潮湿等恶劣环境下进行气象监测。以下是防爆气象站的优点&#xff1a; 防爆性能&#xff1a;防爆气象站能够承受极端恶劣的环境条件&#xff0c;可以在易燃易爆、高温、潮湿等危险环境下进行工作&#xff0…

企业无法处理海量的大文件,FTP不可靠该如何进行替代?

FTP是一项标准协议&#xff0c;用于在网络中进行文件传输&#xff0c;最早于1971年问世&#xff0c;被认为是互联网的基石之一。FTP可在不同操作系统和网络环境下实现文件上传和下载&#xff0c;具备方便、迅速和高效的特性&#xff0c;广泛应用于网站建设、软件更新、数据备份…

Django 8 通用视图基础

1. 什么是通用视图 1. 在terminal 输入 django-admin startapp the_12回车 2. tutorial\settings.py 注册 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.sta…

权威外媒聚焦:Messari强调波场TRON在全球加密支付领域的引领作用

近日,金融时报、费加罗报及美联社等海外权威媒体就波场TRON 在全球加密支付领域的重要进展发布了相关报道。报道引述加密研究机构Messari 《Crypto Theses for 2024》年度报告,重点强调了波场TRON在推动全球加密货币支付尤其是稳定币USDT应用方面的显著成就。 报道提到,波场TR…

【LeetCode:114. 二叉树展开为链表 | 二叉树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Vue3+Typescript+setup / Vue2使用scrollIntoView()实现锚点跳转指定列表

在标签上添加ref属性来引用DOM元素&#xff0c; Vue2中使用$refs来获取该DOM元素并调用scrollIntoView()方法。 使用ref"yearDiv"在每个年份的div元素上添加了一个引用。然后&#xff0c;在yearClick方法中&#xff0c;我们通过this.$refs.yearDiv[year]来获取对应…

HTML5-新增表单input属性

新增表单属性 form控件主要新增的属性: autocomplete 是否启用表单的自动完成功能&#xff0c;取值&#xff1a;on&#xff08;默认&#xff09;、off novalidate 提交表单时不进行校验&#xff0c;默认会进行表单校验 autocomplete属性 概念&#xff1a;autocomplete属性…

Ontrack EasyRecovery(易恢复中国)2024专业数据文件恢复软件

Ontrack EasyRecovery(易恢复中国)是全球著名数据厂商Kroll Ontrack出品的一款专业数据文件恢复软件.EasyRecovery数据恢复软件支持恢复不同存储介质数据:硬盘,光盘,U盘/移动硬盘,数码相机,RAID磁盘阵列数据恢复修复等,EasyRecovery中文版可以恢复被删除或丢失的包括文档,表格,…

nodejs-day1——模块、第三方包管理

自定义模块 我们创建的每个JS文件都是一个自定义模块&#xff0c;并且具有模块作用域&#xff0c;也就是在一个模块中创建的变量、常量、函数等等一切&#xff0c;都只能在当前模块中使用 优点&#xff1a; 1.共享&#xff08;导出/暴露&#xff09;内容给其它模块用&#x…

rabbitmq延时队列相关配置

确保 RabbitMQ 的延时消息插件已经安装和启用。你可以通过执行以下命令来安装该插件&#xff1a; rabbitmq-plugins enable rabbitmq_delayed_message_exchange 如果提示未安装&#xff0c;以下是安装流程&#xff1a; 查看mq版本&#xff1a; 查看自己使用的 MQ&#xff08;…

基于B/S架构的数字孪生智慧监所可视化监管系统

1 前言 物联网技术的发展使云计算技术得到了迅猛的发展及广泛的应用&#xff0c;智能体系的创建已经成为监狱发展的必然趋势。 智慧监狱的创建、智能化管理的推行是监狱管理的创新&#xff0c;也是监狱整体工作水平提升的具体体现。 1.1 建设背景 近年来&#xff0c;司法部不…

数字孪生与边缘计算的结合

数字孪生与边缘计算的结合可以在物理实体附近进行实时数据处理和决策&#xff0c;从而提高响应速度、降低延迟&#xff0c;并有效地利用边缘资源。以下是数字孪生在边缘计算中的一些应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开…

天津最新web前端培训班 如何提升web技能?

随着互联网的迅猛发展&#xff0c;web前端成为了一个热门的职业方向。越来越多的人希望能够通过学习web前端技术来提升自己的就业竞争力。为了满足市场的需求&#xff0c;许多培训机构纷纷推出了web前端培训课程。 什么是WEB前端 web前端就是web给用户展示的东西&#xff0c;…

sqlserver把Long类型的时间转换为可视化的时间

SqlServer 把Long类型日期还原yyyy-MM-dd HH:mm:ss格式日期&#xff1a; SELECT CONVERT(DATETIME, Dateadd(second, 1704330940847 / 1000, 19700101 08:00), 111) AS tt SqlServer 把Long类型日期还原yyyy-MM-dd格式日期&#xff1a; SqlServer中&#xff0c;按照UTC计算标准…

MATLAB对数据的处理(导入,异常处理)

MATLAB对数据的处理 文章目录 MATLAB对数据的处理1、MATLAB导入数据导入的范围导入类型 2、MATLAB处理缺失值和异常值 1、MATLAB导入数据 最常用的就是导入excel表格数据&#xff0c;主页选项卡-导入数据-选择excel文件。 导入的范围 导入数据的范围默认是从第二行开始的&am…

增删改查语句实现了解不同的函数与特殊字符unionunion all区别

一、crud&#xff08;增删改查&#xff09; 1.1、查询 概念&#xff1a; 查询数据是指从数据库中根据需求&#xff0c;使用不同的查询方式来获取不同的数据&#xff0c;是使用频率最高、最重要的操作 注&#xff1a;在MySQL中&#xff0c;当执行一条SQL语句后&#xff0c;系…

【栈越界】变量未赋值前提下,值却发生改变??

首先&#xff0c;提出2个问题&#xff1a; 数组越界 和 栈越界是一回事吗&#xff1f;以上两种越界若有发生&#xff0c;程序一定会跑飞吗&#xff1f; 目录 1. 一个栈越界的例子2. 程序的内存分部3. RAM 空间示意图 1. 一个栈越界的例子 创建 STM32 工程并写了一段测试代码 …