acwing算法基础03-递归,枚举

在这里插入图片描述
cWing 93. 递归实现组合型枚举
在这里插入图片描述
1.排序 考虑顺序
2. 组合 不考虑顺序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参数 -核心
在这里插入图片描述
递归 模板 1.指数型 选/不选 2. 排列 -考虑顺序 (判重数组 不知道哪个数有有没有用过)3.组合 不考虑顺序

数据范围 从n个数里选m个数 组合数中间点 取范围
在这里插入图片描述

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>const int N = 30;int n,m;
int way[N];//表示方案void dfs(int u,int start){//1边界考虑 if(u==m+1){//已经枚举完最后一个数 u =1 没选 u=2选了一个数字for(int i=1;i<=m;i++) printf("%d ",way[i]);puts("");//回车换行return;}for(int i=start;i<=n;i++){way[u]=i;//把当前这个数放入waydfs(u+1,i+1);//递归到下一层way[u]=0;//回复现场}}int main(){scanf("%d%d",&n,&m);dfs(1,1);//第一个数开始枚举,第一个数从数字1开始枚举return 0;
}

优化 剪 (判断)
假如正在选第u个数 说明已经选了u-1个数
后面可以选start 到n 就算把start到n全部悬赏都不够 剪掉
在这里插入图片描述
空的个数 <m
在这里插入图片描述

提前退出 -减枝

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>const int N = 30;int n,m;
int way[N];//表示方案void dfs(int u,int start){//减掉不合理情况if(u+n-start<m) return;//1边界考虑 if(u==m+1){//已经枚举完最后一个数 u =1 没选 u=2选了一个数字for(int i=1;i<=m;i++) printf("%d ",way[i]);puts("");//回车换行return;}for(int i=start;i<=n;i++){way[u]=i;//把当前这个数放入waydfs(u+1,i+1);//递归到下一层way[u]=0;//回复现场}}int main(){scanf("%d%d",&n,&m);dfs(1,1);//第一个数开始枚举,第一个数从数字1开始枚举return 0;
}

AcWing
1209. 带分数
1.暴力
在这里插入图片描述
优化:根据题目本身的性质 刚刚没有用到n的信息 暴力枚举abc 自变量只有两个 除法换成乘法

在这里插入图片描述

还有n的范围是有限的 只有6位 a<=n 所以 a最大也只有6位 所以可以判断在枚举的过程中是不是大于n 如果a大于n 也可以退出

先枚举a 在之后枚举c 直接算出b 嵌套的树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.把b里每个数字抠出来看有没有和a c 相同的

memset()
memcpy

1.枚举a
if (a) dfs_c(u,a,0);对于每个枚举的a 都枚举c
if (check(a,c))ans++; 对于每一个ac 判断b

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>using namespace std;const int N = 30;
bool st[N], backup[N]; // st保证原样,backup用来修改
int ans;
int n;bool check(int a, int c) {// 如果 a 为 0,直接返回 falseif (!a) return false;int b = (n - a) * c;  // 修正公式if (b <= 0) return false;  // b 应该大于零才是有效的// 逐位检查 b 的数字memcpy(backup, st, sizeof st);while (b) {int x = b % 10;  // 取个位b /= 10;  // 删个位if (!x || backup[x]) return false;  // 不能有重复或 0backup[x] = true;}// 检查所有数字 1~9 是否都有for (int i = 1; i <= 9; i++) {if (!backup[i]) return false;}return true;
}void dfs_c(int u, int a, int c) {if (u == n) return;if (check(a, c)) ans++;for (int i = 1; i <= 9; i++) {if (!st[i]) {st[i] = true;dfs_c(u + 1, a, c * 10 + i); // 修正 c 的传递st[i] = false;}}
}void dfs_a(int u, int a) {if (a >= n) return;if (a) dfs_c(u, a, 0);  // 传递给 dfs_cfor (int i = 1; i <= 9; i++) {if (!st[i]) {st[i] = true;dfs_a(u + 1, a * 10 + i);  // 递归选择数字st[i] = false;}}
}int main() {cin >> n;dfs_a(0, 0);  // 当前已经用了多少数字cout << ans << endl;return 0;
}
1. 全局变量和初始化
cpp
const int N = 30;
bool st[N], backup[N];  // st 用来标记数字是否被使用,backup 用于在 check 时备份
int ans;
int n;
st[N]:布尔数组,st[i]表示数字i是否已被使用。通过这个数组来确保每个数字只使用一次。
backup[N]:用来在check函数中备份st数组的状态,确保在递归调用过程中状态不会互相干扰。
ans:存储满足条件的方案总数。
n:目标数字,输入的数字。dfs_a和dfs_c都会用到这个目标。
2. check函数:
cpp
bool check(int a, int c) {if (!a) return false;  // 如果 a 为 0,则返回 falseint b = (n - a) * c;  // 计算 bif (b <= 0) return false;  // b 应该大于 0memcpy(backup, st, sizeof st);  // 备份 st 数组的当前状态while (b) {int x = b % 10;  // 取 b 的个位b /= 10;  // 移除个位if (!x || backup[x]) return false;  // 不能有重复或是 0backup[x] = true;  // 标记数字 x 已经使用过}for (int i = 1; i <= 9; i++) {if (!backup[i]) return false;  // 检查 1 到 9 的所有数字是否都有}return true;  // 如果满足条件,返回 true
}
check函数的目的是验证给定的a和c是否满足题目中要求的条件。
首先检查 a 是否为 0,如果是,直接返回 false。
然后计算 b = (n - a) * c,这个计算的目的是生成一个新的数字 b,并检查 b 的每一位数字。
如果b有重复的数字,或者其中包含数字0,check返回 false。
使用 backup数组来备份当前的 st 数组状态,避免递归过程中的状态冲突。
最后,确认 1~9 之间的数字是否都被使用过(即 backup[i] == true)。
3. dfs_c函数:
cpp
void dfs_c(int u, int a, int c) {if (u == n) return;  // 如果深度达到目标,结束递归if (check(a, c)) ans++;  // 如果满足条件,增加答案数for (int i = 1; i <= 9; i++) {if (!st[i]) {st[i] = true;  // 标记数字 i 已经被使用dfs_c(u + 1, a, c * 10 + i);  // 递归调用,生成新的 cst[i] = false;  // 回溯,取消标记}}
}
dfs_c 是一个递归函数,用来生成数字的组合。
u 是当前递归的深度。
a 是在递归过程中生成的数字的一部分(原始的部分)。
c 是用来拼接数字的另一部分。
u == n 时,表示递归已经达到目标的深度,直接返回。
check(a, c) 用来检查当前的数字组合是否满足条件。如果满足,答案数量ans增加。
接着通过循环遍历 1~9 之间的数字,逐步生成数字 c,并递归调用dfs_c继续生成。
st[i] = true 标记数字 i 已经使用过。
st[i] = false 是回溯的操作,表示取消对数字 i 的使用。
4. dfs_a函数:
cpp
void dfs_a(int u, int a) {if (a >= n) return;  // 如果 a 超过 n,停止递归if (a) dfs_c(u, a, 0);  // 如果 a 不为 0,则调用 dfs_cfor (int i = 1; i <= 9; i++) {if (!st[i]) {st[i] = true;  // 标记数字 i 已使用dfs_a(u + 1, a * 10 + i);  // 递归调用,继续生成 ast[i] = false;  // 回溯}}
}
dfs_a 是另一个递归函数,用来生成数字 a 的组合。它的作用是生成一个基础数字 a,然后通过调用 dfs_c 生成与其相关的数字 c。
a >= n 时,停止递归。
如果 a 非零,则调用 dfs_c,将当前的 a 和 0(空的 c)传递给 dfs_c,生成相关的组合。
接着用递归生成所有 a 的可能组合,并在每次递归后回溯,确保每个数字只使用一次。
5. main函数:
cpp
int main() {cin >> n;  // 输入目标数字 ndfs_a(0, 0);  // 从 0 开始递归生成所有组合cout << ans << endl;  // 输出答案数量return 0;
}
main函数首先读取输入的数字 n。
然后调用 dfs_a(0, 0) 开始递归,0 表示从数字 a 开始为空。
最后输出 ans,即满足条件的组合数量。

递归:f(n) 调用f(1) f(2)
递推f(1) f(2) 返回到f(n)

在这里插入图片描述
在这里插入图片描述
滚动数组
在这里插入图片描述

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

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

相关文章

ASP.NET 部署到IIS,访问其它服务器的共享文件 密码设定

asp.net 修改上面的 IIS需要在 配置文件 添加如下内容 》》》web.config <system.web><!--<identity impersonate"true"/>--><identity impersonate"true" userName"您的账号" password"您的密码" /><co…

多角度审视推荐系统

参考自《深度学习推荐系统》——王喆&#xff0c;用于学习和记录 介绍 推荐工程师需要从不同的维度审视推荐系统&#xff0c;不仅抓住问题的核心&#xff0c;更要从整体上思考推荐问题。 具体包括以下内容&#xff1a; &#xff08;1&#xff09;推荐系统如何选取和处理特征…

从0开始机器学习--Day23--支持向量机

经过前面的学习&#xff0c;我们已经知道在解决问题时&#xff0c;重要的不仅仅是要在算法A或算法B中选择更优的&#xff0c;而是考虑怎么选择用于学习算法的特征和正则化参数&#xff0c;相比神经网络和逻辑回归&#xff0c;支持向量机在这两个方面做得更好。 优化目标(Optimi…

Vulnhub靶场案例渗透[9]- HackableIII

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 敏感数据获取5. 获取shell6. 提权6.1 敏感信息获取6.2 lxd提权 一、靶场搭建 1. 靶场描述 Focus on general concepts about CTF…

生成 Django 中文文档 PDF 版

文章目录 背景克隆 Django 文档和翻译仓库配置 conf.py设置和同步翻译生成 .pot 文件运行 sphinx-intl update复制翻译文件 构建 PDF生成 tex 文件安装 MikTeX生成 PDF Sphinx 生成文档 背景 浏览看到一个帖子&#xff0c;有个评论说可以用 sphinx 构建一个 pdf&#xff0c;正…

关于我、重生到500年前凭借C语言改变世界科技vlog.18——内存函数

文章目录 1. memcpy函数2. memmove函数3. memset函数4. memcmp函数希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 内存函数是用于 操作内存块的一组函数&#xff0c;它们可以对内存进行复制、移动、设置和比较等操作。这些函数主要在 <str…

SpringCloud篇(注册中心 - Nacos)

目录 一、Nacos安装指南 1. Windows安装 1.1. 下载安装包 1.2. 解压 1.3. 端口配置 1.4. 启动 1.5. 访问 2. Linux安装 2.1. 安装JDK 2.2. 上传安装包 2.3. 解压 2.4. 端口配置 2.5. 启动 3. Nacos的依赖 二、Nacos注册中心的入门使用 1. 认识和安装Nacos 2. 服…

链游系统定制化开发:引领游戏产业的新时代

在数字革命的浪潮中&#xff0c;链游&#xff08;区块链游戏&#xff09;作为一种新兴游戏形式&#xff0c;正重新定义游戏产业的发展方向。链游将区块链技术与传统游戏结合&#xff0c;使游戏体验更加公平透明&#xff0c;并赋予玩家真正的资产所有权。这一领域不仅为玩家带来…

《传统视觉算法在视觉算法中的地位及应用场景

一、引言 在计算机视觉领域的发展历程中&#xff0c;传统视觉算法扮演了至关重要的角色。尽管近年来深度学习算法在视觉任务中取得了巨大的成功&#xff0c;但传统视觉算法依然具有不可替代的地位。传统视觉算法通常基于数学模型和手工设计的特征&#xff0c;具有计算效率高、…

第四十二章 Vue中使用mutations修改Vuex仓库数据

目录 一、mutations修改仓库数据 1.1. 概述 1.2. mutations修改数据基本步骤 1.3. 完整代码 1.3.1. main.js 1.3.2. App.vue 1.3.3. index.js 1.3.4. Son1.vue 1.3.5. Son2.vue 二、mutations传参语法 2.1. mutations传参基本步骤 2.2. 完整代码 2.2.1. index.js …

六通道CAN集线器

六通道CAN集线器 --SG-CanHub-600 功能概述 SG_CanHub_600是一款具有六路通道的工业级智能 CAN数字隔离中继集线器。 SG_CanHub_600能够实现信号再生、延长通信距离、提高总线负载能力、匹配不同速 率 CAN网络&#xff0c;同时强大的 ID过滤功能可以极大降低 CAN总线负荷&a…

学校服务器连接pycharm配置2

上一个可能还是有点问题&#xff0c;因为实际在跑的时候读取的其实是本地的anaconda&#xff0c;这个重新整了一下流程 首先在学校服务器先激活自己创建的虚拟环境&#xff0c;这里就不截图了 然后在pycharm里面打开设置 选择这个python解释器 这里有添加解释器 选择SSH …

LeetCode面试经典150题|228.汇总区间

给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按…

excel-VLOOKUP函数使用/XVLOOKUP使用

多个窗口同时编辑表格&#xff0c;方便对照操作 使用开始-视图-新建窗口 将战区信息表的三列数据匹配到成交数据表上 可以使用VLOOKUP函数 有4个参数&#xff08;必须要查找的值&#xff0c; 要查找的区域&#xff0c;要返回区域的第几列数据&#xff0c;一个可选参数查找匹…

kafka和Flume的整合

目录 一、Kafka作为Source 【数据进入到kafka中&#xff0c;抽取出来】 1、在我的flume的conf文件夹下&#xff0c;有个myconf文件夹&#xff1a; 2、 创建一个flume脚本文件&#xff1a; kafka-memory-logger.conf 3、测试 二、kafka作为Sink 【数据从别的地方抽取到kafka里…

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…

【c++笔试强训】(第六篇)

目录 单词搜索&#xff08;搜索&#xff09; 题目解析 讲解算法原理 编写代码 杨辉三⻆&#xff08;动态规划&#xff09; 题目解析 讲解算法原理 编写代码 单词搜索&#xff08;搜索&#xff09; 题目解析 1.题目链接&#xff1a;单词搜索_牛客题霸_牛客网 2.题目描…

【含开题报告+文档+PPT+源码】基于SpringBoot的奶茶点单系统

开题报告 随着社会经济的发展和人们对生活质量的需求提升&#xff0c;奶茶行业迅速崛起&#xff0c;并成为人们生活不可或缺的一部分。消费者在奶茶店点单通常需要排队等候、填写纸质订单&#xff0c;给消费者和奶茶店带来了一定的不便。因此&#xff0c;设计和实现一个基于 S…

【Android、IOS、Flutter、鸿蒙、ReactNative 】约束布局

Android XML 约束布局 参考 TextView居中 TextView 垂直居中并且靠右 TextView 宽高设置百分比 宽和高的比例 app:layout_constraintDimensionRatio"h,2:1" 表示子视图的宽高比为2:1&#xff0c;其中 h表示保持宽度不变&#xff0c;高度自动调整。 最大宽度 设…

Android 下内联汇编,Android Studio 汇编开发

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 内联汇编 Android 内联汇编非常适用于 ARM 架构的性能优化和底层操作&#xff0c;通常用于加密、解密、特定指令优化等领域。 1. 基础语法 内联汇编在 C/C …