算法训练营DAY45|322. 零钱兑换、279.完全平方数

news2024/9/19 11:01:58

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

322. 零钱兑换 - 力扣(LeetCode)icon-default.png?t=MBR7https://leetcode.cn/problems/coin-change/用最少的纸张数量来凑齐目标数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)icon-default.png?t=MBR7https://leetcode.cn/problems/perfect-squares/这一道题的思路和上一道题的思路完全相同,相信大家如果能对我上一道题的细致讲解完全吃透的话,应该不算难题。同样也是求装满背包用的最少完全平方数的数量。

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/183038.html

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

相关文章

HTML零散知识

1、代码规范与思路 参考凹凸实验室代码规范&#xff1a;Aotu.io - 前端代码规范 CSS编写顺序的思路 先确定盒子本身是如何布局 position: absolutefloat: left/rightdisplay: flex 盒子的特性和可见性 display: block/inline-block/inline/nonevisibility/opacity 盒子模型…

【Pytorch项目实战】之生成式模型:DeepDream、风格迁移、图像修复

文章目录生成式模型&#xff08;算法一&#xff09;深度梦境&#xff08;DeepDream&#xff09;&#xff08;算法二&#xff09;风格迁移&#xff08;Style Transfer&#xff09;&#xff08;算法三&#xff09;图像修复&#xff08;Image Inpainting&#xff09;&#xff08;一…

(13)工业界推荐系统-小红书推荐场景及内部实践【用户行为序列建模】

&#xff08;1&#xff09;工业界推荐系统-小红书推荐场景及内部实践【业务指标、链路、ItemCF】 &#xff08;2&#xff09;工业界推荐系统-小红书推荐场景及内部实践【UserCF、离线特征处理】 &#xff08;3&#xff09;工业界推荐系统-小红书推荐场景及内部实践【矩阵补充、…

Docker搭建LNMP+Wordpress

一、服务器环境 容器操作系统IP地址主要软件nginxCentOS 7172.18.0.10Docker-NginxmysqlCentOS 7172.18.0.20Docker-MysqlmysqlCentOS 7172.18.0.20Docker-Mysql 二、Linux系统基础镜像 systemctl stop firewalld setenforce 0 docker pull centos:7 #从公有仓库中下载cento…

cubeIDE开发, stm32人工智能开发应用实践(Cube.AI).篇三

一、cube.AI实际项目应用 接篇二&#xff0c;前文都是采用FP-AI-SENSING1案例和配套的B-L475E-IOT01A开发板来阐述的&#xff0c;而实际项目中&#xff0c;我们都是基于自身项目硬件平台来训练模型及部署模型的&#xff0c;我们仅仅需要cube.AI软件包&#xff08;作为可调用库&…

技术大佬说我对「压测目标」的分析不够细

前言 前面总结压测类型的时候有简单描述了不同压测类型的从准备-脚本设计-压测的整体过程&#xff0c;但是对于压测对象没有更深入的进行分析总结&#xff0c;导致在压测执行结束后&#xff0c;出现压测结果不准确的情况。所以这边就压测的对象进行单独的总结分析。 在执行压测…

lego-loam学习笔记(三)

前言&#xff1a; 对于lego-loam中点云聚类源码的学习&#xff0c;它使用了广度优先算法&#xff0c;并且使用了数组双指针技巧。 主要分为两个部分&#xff1a; 第一个是labelComponents函数&#xff0c;它的功能是为每个点及其相邻的4个点运算角度&#xff0c;在对角度小于…

微信小程序开发

微信小程序开发 | 前言&#xff1a;本文章中的很大一部分内容的图片&#xff0c;文字信息来源于微信小程序官方文档和网络资源&#xff0c;感谢大家的支持&#xff0c;如文章中有不足和错误的地方&#xff0c;请及时联系作者-白泽。并协同修改&#xff0c;相信大家的帮助会使这…

屏蔽360阻止远程执行变更注册表自启动数据的办法

屏蔽360阻止远程执行变更注册表自启动数据的办法 运程服务器上的程序&#xff0c;由于需要。我在服务器中&#xff0c;加入更新升级自身&#xff08;exe&#xff09;文件&#xff0c;并变更操作系统自启动数据的代码。 实践证明&#xff0c;通过客户端&#xff0c;调用运程服务…

spring 声明式事务 @Transactional 运行原理

注意&#xff1a;如果想要理解spring 的声明式事务&#xff0c;必须先理解AOP 的原理。 一、spring注册 InfrastructureAdvisorAutoProxyCreator 通过 EnableTransactionManagement 可以看到先把TransactionManagementConfigurationSelector通过Import注册到spring。同时注意…

VULNCMS靶机

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;i3j0 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2022.03 信息收集 1.查看靶机ip地址 2.探测目标靶机开放端口和服务情况。 nmap -p- -sV -A 192.168.1.108 漏洞…

嵌入式串行接口标准

在嵌入式系统中&#xff0c;经常使用UART接口实现通讯、调试日志数据等功能&#xff0c;但UART是一种异步通信协议&#xff0c;并未定义物理层的电气接口标准。 在板件通信时&#xff0c;UART接口之间通常基于IO直接连接进行通信&#xff08;TTL/CMOS电平标准&#xff0c;3.3V电…

梦熊杯-十二月月赛-白银组题解-B.契约

B. Problem B.契约&#xff08;contract.cpp&#xff09; 内存限制&#xff1a;256 MiB 时间限制&#xff1a;1000 ms 标准输入输出 题目类型&#xff1a;传统 评测方式&#xff1a;文本比较 题目描述&#xff1a; 「璃月」是「契约」的国度。 摩拉克斯认为&#xff0c…

Lua 字符串

Lua 字符串 参考至菜鸟教程。 字符串或串(String)是由数字、字母、下划线组成的一串字符。 Lua 语言中字符串可以使用以下三种方式来表示&#xff1a; 单引号间的一串字符。双引号间的一串字符。[[ 与 ]] 间的一串字符。 以上三种方式的字符串实例如下&#xff1a; string1 …

基于语义分割Ground Truth(GT)转换yolov5目标检测标签(路面积水检测例子)

基于语义分割Ground Truth&#xff08;GT&#xff09;转换yolov5目标检测标签&#xff08;路面积水检测例子&#xff09; 概述 许多目标检测的数据是通过直接标注或者公开平台获得&#xff0c;如果存在语义分割Ground Truth的标签文件&#xff0c;怎么样实现yolov5的目标检测…

【图论】求欧拉回路

前言 你的qq密码是否在圆周率中出现&#xff1f; 一个有意思的编码问题&#xff1a;假设密码是固定位数&#xff0c;设有nnn位&#xff0c;每位是数字0-9&#xff0c;那么这样最短的“圆周率”的长度是多少&#xff1f;或者说求一个最短的数字串定包含所有密码。 理论 一些…

acwing1264_动态求连续区间和

目录 算法分类&#xff1a; 问题描述 算法适用题目范围&#xff1a; 实现代码&#xff1a; 算法分类&#xff1a; 树状数组/线段树 问题描述 给定 n个数组成的一个数列&#xff0c;规定有两种操作&#xff0c;一是修改某个元素&#xff0c;二是求子数列 [a,b]的连续和。 …

1602_MIT 6.828试验环境搭建

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 最近尝试看一下MIT的操作系统教程&#xff0c;找到了一个6.828的课程。看了一下网络上的介绍&#xff0c;看起来这个大家的认可度还是很高的。开动之前&#xff0c…

Android面经_111道安卓基础问题(四大组件BroadCast、内容提供者篇)

该文章涉及的内容主要是&#xff1a;BroadCast、内容提供者&#xff1b; Android基础问题——四大组件之BroadCast、ContentProvider 内容提供者1、BroadCast1.1、Android的广播分类1.2、Android的广播注册方式1.3、广播作用域2、内容提供者Content provider2.1、什么是内容提供…

Google Protobuf 实践使用开发

Android 敏捷开发助手 Lottie动画 轻松使用PNG、JPG等普通图片高保真转SVG图Android 完美的蒙层方案Android MMKV框架引入使用强大无匹的自定义下拉列表Google Protobuf 实践使用开发 Protobuf 实践使用前言Protobuf基本介绍Protobuf 使用配置protobuf 基本语法1. 基本使用2. …