【算法练习Day38】零钱兑换完全平方数

news2024/11/26 23:36:37

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 零钱兑换
  • 完全平方数
  • 总结:

两道题思路上有相似之处,都是求得最少的种类方法,也就是说在完全背包里给定容量时,用最少的物品去装满背包。它和用最多的方法去装满背包也有一些相似,也就是说两者实际上是互通的。

零钱兑换

322. 零钱兑换 - 力扣(LeetCode)
在这里插入图片描述

用最少的纸张数量来凑齐目标数target,在第一次做这道题时候,很多朋友都感觉应该是模拟钱相加得到target,然后用计数器计数什么时候达到最少的纸币,很自然的想到应该要给数组排序,大数额钱放在前面,然后再用次大数额,以此类推,至少我一开始是这样想的。这样或许也是可以做出来的,不过我们本期要讲的是用完全背包的思路解答,我们来看动规五部曲分析,来体会动态规划的神奇之处。

dp数组的含义:dp【j】,j容量下对应的最少硬币个数

递推公式:递推公式和求取填满背包最多物品个数有几个,差不太多。我们是求最少那就是

dp【j】=min(dp【j】,dp【j-coins【i】】+1)

这里为什么要+1?原因在于我们并非模拟硬币的价值相加等于target,dp数组的含义就是此背包容量下,能承载的最少硬币个数有多少,我们比较当前背包容量的已有值的硬币个数与该容量减当前要遍历的硬币价值(也就是腾出背包空间,这一点不懂翻看前面的文章)+1,看它们谁更小取谁。

推到最后得到的dp【target】就是我们要的值,即当前容量下我们可以取的最小硬币个数。看到这里,可能会有一个疑问,如何判断出来我们这个目标值是否真的被这些硬币数量填满了!我们并不是真的模拟硬币相加等于target,那我们是怎么知道这些硬币肯定能装满背包的呢?

答案就在递推公式里,我们求大容量背包时,是由之前的小容量背包填充,也就是说在遍历target这么大的背包之前,一定有一个最小的背包已经被装满,它们可以是dp【1】也可以是dp【2】这是由硬币数组来决定的。我们得到了这个之后,推较大背包容量时,min的第二个值,dp【j-coins【i】】可以帮助我们找到已经填满的背包,那我们如何确定这个较大背包被填满?遍历到不同硬币它减出来的数值不同,所以这一点不用担心,当用到这枚硬币时,它向前找如果找到的那个背包是有一个更新过的值,那么说明那个背包一定是满的,这个背包在这个硬币的基础上,就转化为之前的小背包钱个数+1,得到该背包的答案,如何判断之前背包是否是更新过的值?这一点就要说到dp数组初始化了!

dp数组初始化:

初始化在本题型中,也显得尤为重要,事实上在求装满背包最多或者最少的物品时候,都是很重要的。最多物品时,我们是将数组初始化为0,这一点不只是在递推公式向后推导时,为了避免起始数值影响结果,其实如果推导时候,某一个背包容量一直为0也说明,该容量无法被推出!这种求最少的题,我们将其全部初始化为INT_MAX原因也是一样的,一个是不影响递推公式的推导,另一个是为了告诉推到的时候,如果用到之前的小背包时候,小背包如果需要硬币个数为INT_MAX那么说明,此时我们遍历的该硬币价值,无法填满我们的背包。这时候就该看一看其他硬币了。当然dp【0】不能被初始化为INT_MAX因为题里已经告诉我们,目标值为0的时候,需要硬币个数为0。这也是我们如何推导dp【1】以及后面的关键所在(dp【0】如果是INT_MAX的话,无法向后推,因为一开始dp【1】初始化就是最大数,它的前面的小背包dp【0】也是最大数)。

遍历顺序:先遍历背包还是物品都没有问题。因为是完全背包,这里看不懂的朋友去看之前一期有专门比较完全背包和01背包的专题,但是有人就要问了:即使是完全背包由于遍历顺序不同,不是也会有组合和排列的不同吗?知道这一点的确实很聪明,但是这里我们是求背包容量下最少物品个数,所以无论是怎么推考不考虑答案的顺序,都不能影响我们最后的答案!唯一需要注意的只有正向遍历背包!

dp打印:还是一笔带过,就是为了提醒我们,如果出现一些奇怪的bug,感觉代码完全可以通过,但是就是答案不对,那就考虑打印dp数组,看看是从哪个容量出了问题,再做分析。

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int>dp(amount+1,INT_MAX);
        dp[0]=0;
        for(int i=0;i<coins.size();i++){
            for(int j=1;j<=amount;j++){
                if(j>=coins[i]&&dp[j-coins[i]]!=INT_MAX)
                dp[j]=min(dp[j],dp[j-coins[i]]+1);
            }
        }
        if(dp[amount]==INT_MAX)return -1;
        return dp[amount];
    }
};

完全平方数

279. 完全平方数 - 力扣(LeetCode)

这一道题的思路和上一道题的思路完全相同,相信大家如果能对我上一道题的细致讲解完全吃透的话,应该不算难题。同样也是求装满背包用的最少完全平方数的数量。

dp数组的含义,递推公式,dp数组初始化,完全一样,遍历顺序也是一样的,但是遍历的for循环需要注意一下,我们求得是完全平方数,第一层循环控制数一点点自增,而不是直接给它变到平方数,因为这样有利于代码书写,当我们写第二层循环时候,再调整数据的平方。还有就是递推公式的思路是不变的,但是dp【j-coins【i】】变成了dp【j-i*i】,也就是减去这个平方数来查前面的背包是否有正确值,具体代码如下。

class Solution {
public:
    int numSquares(int n) {
        vector<int>dp(n+1,INT_MAX);
        dp[0]=0;
        for(int i=1;i*i<=n;i++){
            for(int j=i*i;j<=n;j++){
                dp[j]=min(dp[j],dp[j-i*i]+1);
            }
        }
        return dp[n];
    }
};

总结:

今天我们完成了零钱兑换、完全平方数两道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

软件测试:单元测试、集成测试、系统测试详解

实际的测试工作当中&#xff0c;我们会从不同的角度对软件测试的活动进行分类&#xff0c;题主说的“单元测试&#xff0c;集成测试&#xff0c;系统测试”&#xff0c;是按照开发阶段进行测试活动的划分。这种划分完整的分类&#xff0c;其实是分为四种“单元测试&#xff0c;…

TablePlus for Mac 数据库管理工具功能介绍

TablePlus是一款功能强大的数据库管理工具&#xff0c;专为Mac操作系统设计。它支持多种主流数据库&#xff0c;包括MySQL&#xff0c;PostgreSQL&#xff0c;SQLite&#xff0c;Microsoft SQL Server&#xff0c;Amazon Redshift等等。无论您是开发人员、数据库管理员还是数据…

【2024最新】Android Debug Bridge【下载安装】零基础到大神【附下载链接】

一、ADB简介 1、什么是adb ADB 全称为 Android Debug Bridge&#xff0c;起到调试桥的作用&#xff0c;是一个客户端-服务器端程序。其中客户端是用来操作的电脑&#xff0c;服务端是 Android 设备。 ADB 也是 Android SDK 中的一个工具&#xff0c;可以直接操作管理 Androi…

多个PDF发票合并实现一张A4纸打印2张电子/数电发票功能

python教程79--A4纸增值税电子发票合并打印_python 打印 发票设置_颐街的博客-CSDN博客文章浏览阅读7.9k次。接上篇https://blog.csdn.net/itmsn/article/details/121902974?spm1001.2014.3001.5501一张A4纸上下2张增值税电子发票实现办法。使用环境&#xff1a;python3.8、ma…

【C++基础知识学习笔记】精华版(复习专用)

常用语法 函数重载(Overload) 规则: 函数名相同 参数个数不同、参数类型不同、参数顺序不同 注意: 返回值类型与函数重载无关 调用函数时,实参的隐式类型转换可能会产生二义性 默认参数 C++ 允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下: 默认参数只能…

chinese_llama_aplaca训练和代码分析

训练细节 ymcui/Chinese-LLaMA-Alpaca Wiki GitHub中文LLaMA&Alpaca大语言模型本地CPU/GPU训练部署 (Chinese LLaMA & Alpaca LLMs) - 训练细节 ymcui/Chinese-LLaMA-Alpaca Wikihttps://github.com/ymcui/Chinese-LLaMA-Alpaca/wiki/%E8%AE%AD%E7%BB%83%E7%BB%86%E…

selenium自动化测试入门 —— 获取元素对象!

一、元素定位简介 八种属性定位页面元素&#xff1a; By.ID By.XPATH By.LINK_TEXT By.PARTIAL_LINK_TEXT By.NAME By.TAG_NAME By.CLASS_NAME By.CSS_SELECTOR webdriver元素定位方法&#xff1a; driver.find_element(By.XXX,元素属性) # 定位单个元素 driver.find_elemen…

按键精灵中常用的命令

1. 声明变量&#xff1a; Dim 2. 注释语句 (1). 单行注释&#xff1a;这是一行注释&#xff0c;使用一个单引号进行注释&#xff1b; (2). 单行注释&#xff1a;// 这是一行注释&#xff0c;使用一对反斜杠进行注释; (3). 多行注释&#xff1a;/*这是多行注释&#xff0c;中…

canal+es+kibana+springboot

1、环境准备 服务器&#xff1a;Centos7 Jdk版本&#xff1a;1.8 Mysql版本&#xff1a;5.7.44 Canal版本&#xff1a;1.17 Es版本&#xff1a;7.12.1 kibana版本&#xff1a;7.12.1 软件包下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1jRpCJP0-hr9aI…

基于野狗算法的无人机航迹规划-附代码

基于野狗算法的无人机航迹规划 文章目录 基于野狗算法的无人机航迹规划1.野狗搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用野狗算法来优化无人机航迹规划。 1.野狗搜索算法 …

前端面试题整理(一)

前言&#xff1a; 这篇博客是记录自己在看面试过程中还未完全掌握的前端知识点&#xff0c;也是一些前端面试需要掌握的知识点&#xff08;总结的并不全面&#xff0c;可以参考&#xff0c;具体情况以自己实际为准&#xff09;,并且这篇博客正在持续更新中… 附言&#xff1a…

2023.11.4-Envoy使用案例-oss

2023.11.4-Envoy使用案例 目录 本节实战 实战名称&#x1f6a9; 实战&#xff1a;前端代理-2023.11.2(测试成功)&#x1f6a9; 实战&#xff1a;流量镜像-2023.11.4(测试成功)&#x1f6a9; 实战&#xff1a;故障注入过滤器-2023.11.4(测试成功)&#x1f6a9; 实战&#xff1a…

【Invea Therapeutics】申请7500万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;美国生物制药公司【Invea Therapeutics】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为(INAI) &#xff0c;Invea …

基于龙格-库塔算法的无人机航迹规划-附代码

基于龙格-库塔算法的无人机航迹规划 文章目录 基于龙格-库塔算法的无人机航迹规划1.龙格-库塔搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用龙格-库塔算法来优化无人机航迹规划…

xlua源码分析(二)lua Call C#的无wrap实现

xlua源码分析&#xff08;二&#xff09;lua Call C#的无wrap实现 上一节我们主要分析了xlua中C# Call lua的实现思路&#xff0c;本节我们将根据Examples 03_UIEvent&#xff0c;分析lua Call C#的底层实现。例子场景里有一个简单的UI面板&#xff0c;面板中包含一个input fie…

多模态大模型最全综述

由微软7位华人研究员撰写--多模态基础模型已经从专用走向通用 它从目前已经完善的和还处于最前沿的两类多模态大模型研究方向出发&#xff0c;全面总结了五个具体研究主题&#xff1a; 视觉理解视觉生成统一视觉模型LLM加持的多模态大模型多模态agent 1、谁适合阅读这份综述&…

YOLOv8独家原创改进:自研独家创新BSAM注意力 ,基于CBAM升级

💡💡💡本文全网首发独家改进:提出新颖的注意力BSAM(BiLevel Spatial Attention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的 BiLevel Attention+Spartial Attention 1)作为注意力BSAM使用; 推荐指数:…

时序预测 | MATLAB实现时间序列ACF和PACF分析

时序预测 | MATLAB实现时间序列ACF和PACF分析 目录 时序预测 | MATLAB实现时间序列ACF和PACF分析基本介绍程序设计参考资料基本介绍 自回归分析是线性回归分析的一种推广,主要是研究一个序列反映的自我因果关系。普通线性回归基于互相关分析,涉及两个以上的变量,一个作为因变…

Iceberg教程

目录 教程来源于尚硅谷1. 简介1.1 概述1.2 特性 2. 存储结构2.1 数据文件(data files)2.2 表快照(Snapshot)2.3 清单列表(Manifest list)2.4 清单文件(Manifest file)2.5 查询流程分析 3. 与Flink集成3.1 环境准备3.1.1 安装Flink3.1.2 启动Sql-Client 3.2 语法 教程来源于尚硅…

产品经理入门学习(一):认识产品经理

参考引用 黑马-产品经理入门基础课程 1. 合格的产品经理 1.1 什么是产品 上述产品的共性&#xff1a;解决某个问题的东西上述产品的区别 有形&#xff08;上图左&#xff09;&#xff1a;颜色、形状、质地和尺寸无形&#xff08;上图右&#xff09;&#xff1a;脑力劳动成果、…