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

文章目录

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

原题链接

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的所有数字都选上也不够要求的剩下空位个数字,就是不符合情况,可以特判直接退出的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端项目打包并部署

一、vue项目打包 1.1 方式一&#xff1a;vue项目命令行打包 在当前项目路径下&#xff0c;执行命令 npm run build 在当前项目路径下&#xff0c;生成 一个dist文件夹。 将来部署项目&#xff0c;是部署的dist这个文件。 1.2 方式二&#xff1a;使用vue ui打包项目 在终端中…

离线部署的MinIO

网络有不同的部分&#xff0c;例如 DMZ、公共、私有、堡垒等。这实际上取决于您的组织和网络要求。在部署应用程序时&#xff0c;任何应用程序&#xff0c;我们都需要考虑类型以及它是否需要位于网络的特定部分。 例如&#xff0c;如果要部署数据库&#xff0c;则不希望它位于…

Hubery-个人项目经历记录

研究生期间很有幸的进入到了崔老师的组&#xff0c;从此也就进入到了分析人体生理信号的领域&#xff0c;充满挑战的同时也充满了乐趣。借着CSDN整理一下近几年来参与的项目&#xff0c;这里蕴含着我各种美好的回忆&#xff0c;也作为一个展示自己的平台吧。 开始之前&#xff…

CSS效果(工作中常用)

1、css文字溢出省略号 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略…

磁盘管理------逻辑卷、磁盘配额

目录 引导语&#xff1a; 一、逻辑卷 &#xff08;一&#xff09;逻辑卷的概念 &#xff08;二&#xff09;建立逻辑卷 1.新建磁盘 2.创建物理卷 3.创建卷组 4.创建逻辑卷 5.挂载 6.使用分区创建逻辑卷 &#xff08;三&#xff09;磁盘扩容 1.创建新的物理卷 2.扩容…

everything 本地文件搜索工具 完胜WIndows搜索 速度99% 超级给力

"Everything" 是一个 Windows 平台上的免费软件&#xff0c;它是一款功能强大的本地文件搜索工具。它允许用户在计算机上快速而准确地搜索文件和文件夹。以下是一些 "Everything" 的主要特点&#xff1a; 实时搜索&#xff1a; "Everything" 提供…

U盘数据恢复软件,高效恢复数据记好这2款!

“我的u盘用了很久了&#xff0c;有时候会遇到u盘数据丢失的情况。想问问大家有什么比较好用的u盘数据恢复软件可以推荐吗&#xff1f;” 在Windows电脑上&#xff0c;U盘已成为我们存储和传输数据的常用设备。然而&#xff0c;由于各种原因&#xff0c;U盘中的数据可能会丢失或…

arm64操作系统LLVM源码编译

编译electron需要对应版本的LLVM编译器,因此需要构建arm64版本的LLVM。构建过程如下。 一、编译环境 需要cmake版本大于3.20,因此需要更新cmake cmake源码下载地址:Download CMake Download CMake 下载后解压编译 tar -zxvf cmake-3.28.1.tar.gz cd cmake-3.28.1 mkdir…

计算机毕业设计------基于SpringCloud的实验室管理系统

项目介绍 实验室管理系统的用户可以分为两种&#xff1a;系统管理员和普通用户。系统管理员主要功能&#xff1a; 登录登出、分析数据、管理用户、管理日志、管理实验室、管理预约、维护个人资料、实验室保修管理 用户主要功能&#xff1a; 注册登录、查询实验室、实验室预约…

大数据开发的专业术语

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项…

C语言中指针变量如何使用

一、指针变量的定义与声明 1.1 定义 指针变量是用来存储另一个变量的内存地址的变量。在C语言中&#xff0c;指针变量的类型是指向某个类型的指针。例如&#xff0c;int *p; 表示一个整型指针变量p。 1.2 声明 指针变量的声明分为两种形式&#xff0c;一种是直接声明&#…

高管换防,年度销量缺口较大,朱华荣掌舵的阿维塔前路在何方?

高管换防下&#xff0c;阿维塔的压力依然不小。 阿维塔前任CEO谭本宏曾将汽车行业的角逐比喻为一场全程马拉松&#xff0c;“有的人开始跑的很快&#xff0c;结果跑到15公里就被迫下场&#xff0c;就是因为节奏和动作变形”。在他看来&#xff0c;设立合理的目标与发展节奏&am…

.cer格式证书文件和 .pfx格式证书文件有什么区别?

这里我们将讨论.cer和.pfx文件类型之间的差异。 什么是数字证书&#xff1f; 数字证书在电子通信中用作验证身份的密码机制。我们需要这些证书来建立安全的在线通信渠道&#xff0c;并确保数字数据的隐私、真实性和正确性。 数字证书包括主题&#xff08;实体详细信息&#xf…

阿里云PolarDB数据库不同配置租用价格表

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…

【IP-Adapter】进阶 - 同款人物【2】 ☑

测试模型&#xff1a;###最爱的模型\flat2DAnimerge_v30_2.safetensors [b2c93e7a89] 原图&#xff1a; 加入 control1 [IP-Adapter] 加入 control 2 [OpenPose] 通过openpose骨骼图修改人物动作。 加入 control 3 lineart 加入cotrol3 …

PostgreSQL 分区

由于大量数据存储在数据库同一张表中&#xff0c;后期性能和扩展会受到影响。所以需要进行表分区&#xff0c;因为它可以将大表分成较小的表&#xff0c;从而减少内存交换问题和表扫描&#xff0c;最终提高性能。庞大的数据集被分成更小的分区&#xff0c;更易于访问和管理。 …

静态网页设计——电影角(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;本网页主要利用HTML语言编写&#xff0c;简要介绍世界上一些主要国家&#xff0c;例如&#xff0c;中&#xff0c;…

RT-DETR Gradio 前端展示页面

效果展示 使用方法 Gradio 是一个开源库,旨在为机器学习模型提供快速且易于使用的网页界面。它允许开发者和研究人员轻松地为他们的模型创建交互式的演示,使得无论技术背景如何的人都可以方便地试用和理解这些模型。使用Gradio,你只需几行代码就可以生成一个网页应用程序,…

从不同应用,划片机主要包括如下几个方面

在半导体行业中&#xff0c;划片机被广泛应用于各种材料和应用的切割和加工。根据不同的应用&#xff0c;划片机主要可以分为以下几个方面&#xff1a; 一、半导体材料划片 半导体材料划片是划片机最早的应用领域之一。在这个领域中&#xff0c;划片机主要被用于将半导体材料&…