每日算法打卡:递归实现指数型枚举 day 1

文章目录

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

原题链接

92. 递归实现指数型枚举

题目难度:简单

题目描述

1 ∼ n 1 \sim n 1n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式

输入一个整数 n。

输出格式

每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。

对于没有选任何数的方案,输出空行。

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。

数据范围

1 ≤ n ≤ 15 1 \le n \le 15 1n15

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

题目分析

这道题目的意思其实一目了然,然后我们可以根据数据范围选择出算法复杂度,实际上是 O ( 2 n ) O(2^n) O(2n)级别即可

我们主要的思路就是需要确定从 1 ∼ n 1\sim n 1n中确定出这个数是选还是不选,因此所有的情况数就是 2 n 2^n 2n

这道题的目的其实是训练我们递归的思想,对于递归(dfs)最重要的就是顺序,需要不重不漏的把所有可能的方案都顾及到,具体到这道题我们就只需要从 1 ∼ n 1\sim n 1n依次考虑选和不选的两种情况

这样我们就可以画一个递归树

屏幕截图 2024-01-01 215051.png

这里我们也称之为递归搜索树,我们以三个数字为例,实际上是可以通过这种方法枚举出所有情况的,接下来的问题就是我们如何去实现,如何记录每一种情况下的状态

这里的状态我们有两种方法,一是开一个长度为 n n n的数组,第二种方法就是利用位运算,将数位为1的位置标记为选中,将数位为0的位置标记为未选中

这里我们采用第一种方法来实现,因为比较直观容易理解

#include<iostream>
using namespace std;const int N = 15;int n;
int state[N]; // 状态数组,用于记录每个位置上的数据是否被选中,我们使用1表示选中,-1表示未选中,0表示还轮到他选void dfs(int cur) // cur 表示当前在第cur位
{// 递归首先要确定边界情况if (cur == n)// 当我们每一次搜索到最后一个数字的时候需要从前往后遍历每一位,判断这个位置上的数据是否被选中,如果被选中,就需要输出{for (int i = 0; i < n; i++){if (state[i] == 1){cout << (i + 1) << ' '; // 这里因为刚好是从1到n的数,我们可以借用i来表示}}cout << '\n';return;}state[cur] = 1; // 表示选择这个位置的数据dfs(cur + 1); // 递归到下一个位置state[cur] = 0; // 恢复成没有开始选择这个位置的情况state[cur] = -1;dfs(cur + 1);state[cur] = 0;
}int main()
{cin >> n; // 输入数据dfs(0); // 表示从第0位开始递归return 0;
}

对于递归的情况,我们在回到上一步的时候,需要恢复原来的样子,不然再次进行操作时,可能会引出错误的情况,需要保持这个习惯,其次我们在写递归函数的时候,需要首先考虑何时递归结束

感谢各位的支持,如果你发现文章中有任何不严谨或者需要补充的部分,欢迎在评论区指出

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解SQL中not in 与null值的真实含义

A not in B的原理是拿A表值与B表值做是否不等的比较, 也就是a ! b. 在sql中, null是缺失未知值而不是空值。 当你判断任意值a ! null时, 官方说, “You cannot use arithmetic comparison operators such as , <, or <> to test for NULL”, 任何与null值的对比都将返…

电脑怎么设置代理IP上网?如何隐藏自己电脑的真实IP?

在现代互联网中&#xff0c;代理IP已成为许多用户保护隐私和上网安全的重要手段。通过设置代理IP&#xff0c;用户可以隐藏自己的真实IP地址&#xff0c;提高上网的安全性&#xff0c;同时保护个人信息不被泄露。本文将详细介绍如何设置代理IP上网以及如何隐藏电脑的真实IP地址…

CSS 纵向顶部往下动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ scale-up-ver-top: isAnimating }"><!-- 元素内容 -->&…

如何使用Git进行代码版本管理

目录 建立仓库 分支管理 推送代码 问题 建立仓库 先在远程代码托管平台&#xff08;如GitHub、GitLab等&#xff09;上创建一个新的仓库 使用命令行或终端&#xff0c;进入你的本地项目目录 如果项目还没有使用Git进行版本控制&#xff0c;可以通过执行以下命令来初始…

光敏电阻式光控开关典型应用电路

光敏电阻一般广泛应用于各种光控电路&#xff0c;监控灯板&#xff0c;玩具控制等&#xff0c;如对灯光的控制、调节等场合&#xff0c;也可用于光控开关&#xff0c;下面给出几个典型应用电路。 1、光敏电阻调光电路 图中是一种典型的光控调光电路&#xff0c;其工作原理是&a…

Python批量读取大量nc格式文件并导出全部时间信息

本文介绍基于Python语言&#xff0c;逐一读取大量.nc格式的多时相栅格文件&#xff0c;导出其中所具有的全部时间信息的方法。 .nc是NetCDF&#xff08;Network Common Data Form&#xff09;文件的扩展名&#xff0c;表示一种常用的科学数据存储格式。NetCDF是一种自描述的、可…

算法学习系列(十四):并查集

目录 引言一、并查集概念二、并查集模板三、例题1.合并集合2.连通块中点的数量 引言 这个并查集以代码短小并且精悍的特点&#xff0c;在算法竞赛和面试中特别容易出&#xff0c;对于面试而言&#xff0c;肯定不会让你去写一两百行的代码&#xff0c;一般出的都是那种比较短的…

是否在消息上打标?

场景 用户可以创建某个虚拟形象&#xff0c;将该形象发布到聊天平台&#xff0c;然后和该形象进行聊天。 用户创建虚拟形象的时候&#xff0c;开启备份功能&#xff0c;将自己的聊天记录备份到指定位置&#xff0c;也可以关闭开关&#xff0c;停止备份功能。 聊天功能和备份…

双指针——移动零

题目 示例 算法原理 我们使用两个指针&#xff0c;cur扫描数组&#xff0c;如果nums[cur]为非0&#xff0c;dest&#xff0c;然后让nums[cur]与nums[dest]交换&#xff0c;从而实区间[0,dest]为非0,[dest1,cur]为0&#xff0c;[cur,numsSize-1]为未扫描 题目链接&#xff1a;28…

网络安全—PKI公钥基础设施

文章目录 前提知识散列函数非对称加密数字签名 PKI受信任的人RA注册CA颁发IKE数字签名认证&#xff08;交换证书&#xff09;密钥管理 前提知识 散列函数 散列也可以叫哈希函数&#xff0c;MD5、SHA-1、SHA-2、、&#xff08;不管叫啥&#xff0c;都记得是同一个东西就行&…

uni-app设置地图显示

使用前需到**高德开放平台&#xff08;https://lbs.amap.com/&#xff09;**创建应用并申请Key 登录 高德开放平台&#xff0c;进入“控制台”&#xff0c;如果没有注册账号请先根据页面提示注册账号 打开 “应用管理” -> “我的应用”页面&#xff0c;点击“创建新应用”&…

ESP32入门六(读取引脚的模拟信号[4]:Arduino-ESP32 ADC API详解)

在之前的章节中&#xff0c;我们测试了读取引脚的模拟值&#xff0c;ADC功能在实际中用途十分广泛&#xff0c;在本章中&#xff0c;我们把一些常用的ADC函数做一个详细的说明。 ADC单次性模式 ADC单次模式API与Arduino的analogRead功能完全兼容。当您调用analogRead或analogR…