第39天| 70. 爬楼梯 (进阶)、LeetCode322. 零钱兑换、LeetCode279.完全平方数

news2024/10/5 21:17:52

1.题目描述:

                给定n阶台阶的楼梯,一次能跳m阶问跳到楼顶有多少种方法?假设m可以是1~9任意一种,weight[i] = {1,2,3,4,5,6,7,8,9}

解法:

        1.五步曲:

                        ①将本题转换成背包问题---即给定容量为n的背包,求放满这个背包一共有多少种方法,每个物品可以重复使用

                        ②dp[j]表示,容量为j,有dp[j]种方法填满

                        ③递推公式:dp[j] += dp[j-weight[i]]

                        ④初始化:因为根据前面的值获得的,所以初始化dp[0] = 1---即容量为0,不填充也是一种方法,否则的话根据递推公式所有的值都会是0.非0位置的初始化=?因为要和本身累加和,所以初始化为0。

                        ⑤遍历顺序:因为是完全背包问题,所以正序遍历背包。那么先遍历背包还是先遍历物品呢?因为我们要求的是多少种方法,即121和122是不一样的,故求的是排列数,故先遍历背包再遍历物品

        2.步骤:

                        ①创建dp数组,长度为n+1

                        ②初始化dp数组,dp[0] = 1,其余位置为0

                        ③遍历:for(背包正序遍历,从0开始到n){

                                                for(物品,从0开始到weight[i].length){

                                                      if(j >= weight[i]){

                                                                dp[j] += dp[j-weight[i]];}

                                                                                                                }

                                                                                                }

                        ④最后返回dp[n]

下面为代码(java):

 

2.题目链接:322. 零钱兑换 

题目描述:

                给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

                计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

                你可以认为每种硬币的数量是无限的。

解法:

        1.五步曲:

                                ①将本题转化成背包问题---即装满容量为amount的背包,求最少装物品的个数

                                ②dp[j]表示的就是装满容量为j的背包,最少装dp[j]个物品

                                ③递推公式:dp[j] = ?假如背包中装了一个物品重量为coins[i],那么此时的dp[j] = dp[j-coins[i]] + 1,但是对于每一个i值都有一个dp[j],而我们要求其最小值,所以dp[j] = min(dp[j-coins[i]] + 1, dp[j])

                                ④初始化:根据递推公式,当前值是根据前面的值求出来的,所以要初始化dp[0] = ?即dp[0] = 0,装满背包容量为0的背包需要最少装物品的个数为0.

                                                对于非0处的值应该初始化为多少呢?根据递推公式,要和本身的值取最小,所以我们要初始化成最大值---即Integer.MAX_VALUE

                                ⑤遍历顺序:因为我们要求的是硬币个数,所以不管是有序的还是无序的,个数都是一样,所以先遍历背包或者先遍历物品都是可以的。而同时每个硬币可以用无限次,所以这是个完全背包问题,所以要正序遍历背包。

                                ⑥最后返回dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount]

                                ⑦需要注意的是在写递推公式的上方要加上if(dp[j - coins[i]] != MAXVALUE) ,因为如果等于的话,递推公式就相当是dp[j] = dp[j]没有意义

        2.步骤:

                                ①创建dp数组,长度为amount+1

                                ②初始化dp数组,dp[0] = 1,非0位置初始化为Integer.MAX_VALUE

                                ③遍历顺序:先遍历背包还是先遍历物品都可以(因为求的是个数),正序遍历背包。

                                if(dp[j-coins[i]] != Integer.MAX_VALUE){dp[j] = min(dp[j],dp[j-coins[i]] + 1)}

                                ④最后返回 dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount] --- 即如果构不成amount就返回-1,构成了就返回需要的最少硬币个数。

下面为代码(java):

3.题目链接:279. 完全平方数 

题目描述:

                给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

                完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

解法:

        1.五步曲:

                                ①将其转化成背包问题---给定容量为n的背包,求将其装满的最少物品数目。

                                ②dp[j]的含义就是将容量为j的背包装满,需要的少完全平方数的数量。

                                ③递推公式:dp[j] = min(dp[j], dp[j - i *i]+1)

                                ④初始化:依旧要初始化为dp[0] = 0;非0位置:因为和本身比要取最小,所以取最大Integer.MAX_VALUE

                                ⑤遍历顺序:因为求的是个数,所以不论是求组合数还是排列数,个数都是一致的,所以先遍历物品还是先遍历背包都可以。因为每一个完全平方数可以用多次,所以是完全背包,所以要正序遍历背包。

                                ⑥最后返回dp[n]

                                ⑦要注意的是在遍历物品的时候有减枝操作,即for(i = 1; i*i<=n;i++)因为如果i的平方大于n了,那么n肯定不能由i的方法构成。

        2.步骤:

                                ①创建dp数组,长度为n+1

                                ②初始化:dp[0] = 0;非0处初始化为最大值

                                ③遍历:for(i=1;i*i <= n;i++){

                                                        for(j = i*i; j <=n;j++){

                                                                if(dp[j-i*i] != Integer.MAX_VALUE){

                                                                        dp[j] = min(dp[j], dp[j-i*i]+1);}

                                                                                        }

                                                                                        }

                                ④最后return dp[n]

下面为代码(java):

4.总结:

                ①三题都是物品可以重复使用,所以都是完全背包问题,背包都要正序遍历。

                ②爬楼梯进阶 --- 求的是方法数目,即排列数,因为不同的数字排列是不同的方法。所以要先遍历背包再遍历物品。

                ③零钱兑换 --- 求的是最少个数,所以无论求的是排列数还是组合数个数都是相同的,所以先遍历背包还是先遍历物品都可以。递推公式:dp[j] = min(dp[j], dp[j-coins[i]] + 1)

                ④完全平方和 --- 求的是最少个数,所以哪个先遍历都可以。递推公式:dp[j] = min(dp[j], dp[j-i*i] + 1)

                ⑤在求最小值的时候初始化为最大值,求最大值的时候初始化为合理的最小值

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

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

相关文章

MySQL系统变量和自定义变量

1 系统变量1.1 查看系统变量可以使用以下命令查看 MySQL 中所有的全局变量信息。SHOW GLOBAL VARIABLES; MySQL 中的系统变量以两个“”开头。global 仅仅用于标记全局变量&#xff1b;session 仅仅用于标记会话变量&#xff1b;首先标记会话变量&#xff0c;如果会话变量不存在…

TCP实现可靠传输的实现

TCP实现可靠传输的实现 目录TCP实现可靠传输的实现ARQ协议停止等待协议&#xff08;古老&#xff09;连续ARQ协议累计重传&#xff08;回退N帧的ARQ协议&#xff09;缓存确认&#xff08;选择重传ARQ协议&#xff09;超时重传的时间选择TCP的流量控制零窗口探测报文段Nagle算法…

4.8 注解与自定义注解

文章目录1.概述2.注解的分类2.1 JDK注解2.2 元注解2.2.1 Target ElementType…2.2.2 Retention RetentionPolicy…3 自定义注解1.概述 在注解刚出现时&#xff0c;曾受到过好多程序员的鄙夷&#xff0c;觉得这就是多此一举的操作&#xff1b; 但随着时间的推移&#xff0c;越…

电子技术——电流镜负载的差分放大器

电子技术——电流镜负载的差分放大器 目前我们学习的差分放大器都是使用的是差分输出的方式&#xff0c;即在两个漏极之间获取电压。差分输出主要有以下优势&#xff1a; 降低了共模信号的增益&#xff0c;提高了共模抑制比。降低了输入偏移电压。提升了差分输入的增益。 由于…

【单目标优化算法】食肉植物优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

vant 4 正式发布,支持暗黑主题,那么是如何实现的呢

2022年10月25日首发于掘金&#xff0c;现在同步到公众号。11. 前言大家好&#xff0c;我是若川。我倾力持续组织了一年多源码共读&#xff0c;感兴趣的可以加我微信 lxchuan12 参与。另外&#xff0c;想学源码&#xff0c;极力推荐关注我写的专栏《学习源码整体架构系列》&…

八股文总是忘?一张图牢记JVM内存结构|金三银四系列

金三银四又来啦&#xff01;八股文还是得复习起来&#xff0c;最近准备把一些常见的八股文知识点聊聊。本文详解了JVM内存结构和各个部分详细内容&#xff0c;应付面试绰绰有余&#xff01;点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达…

visual studio2022配置opencv

标题&#xff1a;在vs下配置使用opencv 流程&#xff1a; 1、下载安装opencv 2、添加环境变量 3、vs中配置属性 4、使用 5、可能遇到的报错和解决 1、 下载安装opencv 官网下载地址&#xff1a; https://opencv.org/releases/ 我这里是windows环境&#xff0c;所以选择点击w…

Java数据结构之优先级队列

前言总是忘了优先队列的一些应用&#xff0c;其实这都是很基础的了。为了再加强印象&#xff0c;抄一遍吧。PriorityQueue简介PriorityQueue&#xff0c;即优先级队列。优先级队列可以保证每次取出来的元素都是队列中的最小或最大的元素&#xff08;Java优先级队列默认每次取出…

微信小程序 if语法、for循环 条件渲染、列表渲染等讲解

这篇文章我想给大家学习的就是如何使用 if 去判断 组件的是显示和隐藏&#xff0c;如何使用for循环来渲染列表等重复的内容。 1.if语法的使用 在小程序中&#xff0c;我们可以使用wx:if"{{条件}}"来判断是否需要渲染该代码块 也可以用 wx:elif 和wx:else 来添加 el…

【java】Spring Boot -- Spring的IOC实现原理

文章目录IOC定义理解IOC不使用IOC&#xff1a;使用IOC&#xff1a;使用IOC的好处IOC提供被依赖对象的方式构造器注入setter 方法注入接口方式注入简单模拟IOC总结IOC定义 IoC 全称为 Inversion of Control&#xff0c;翻译为 “控制反转”&#xff0c;它还有一个别名为 DI&…

【Selenium】十分钟手把手带你学会WebDriver API

目录 1、定位元素【8种】 2、操作测试对象 3、添加等待 4、弹窗类型 5、浏览器的操作 6、键盘事件 7、选择框 8、上传文件 1、定位元素【8种】 元素定位是自动化测试的核心&#xff0c;想要去操作一个对象&#xff0c;第一步就是需要我们先去识别这个对象。每个对象就会…

全民ChatGPT热:快来解锁你的“全能网友”

前 言 2021年11月30日&#xff0c;OpenAI推出人工智能聊天原型ChatGPT&#xff0c;赚足了眼球&#xff0c;在AI界引发了类似AIGC让艺术家失业的大讨论。 据报道&#xff0c;ChatGPT在开放试用的短短几天&#xff0c;就吸引了超过 100 万互联网注册用户。并且社交网络流传出各种…

html5标签

图片&#xff1a;image 主要属性&#xff1a; src&#xff1a;源属性的值是图像的 URL 地址。 alt&#xff1a;用来为图像定义一串预备的可替换的文本。 注意事项&#xff1a; 注意: 假如某个 HTML 文件包含十个图像&#xff0c;那么为了正确显示这个页面&#xff0c;需要加…

速通Spring

尚硅谷2023最新版Spring6课程_bilibili 1 Spring 【强制】Spring是什么&#xff1f; 1) Spring是一款主流的Java EE轻量级开源框架。 轻量级&#xff1a;体积很小&#xff0c;且不需要依赖于其他组件。 2) 狭义的Spring。 Spring Framework。 3) 广义的Spring。 以Spring F…

python对多个csv文件进行合并(表头需一致)

之前写过python对【多个Excel文件】中的【单个sheet】进行合并&#xff0c;参考&#xff1a;点我 之前也写过python对【多个Excel文件】中的【多个sheet】进行合并&#xff0c;参考&#xff1a;点我 今天再写一个python对多个csv格式的文件进行合并的小工具 但是大家切记&am…

GIS开源框架:ArcGIS文件地理数据库(GDB)解析与入库

对于GIS专业毕业的同学&#xff0c;想必对于ArcGIS软件不会太陌生&#xff0c;对于地理数据库也有一定的了解和使用经验。但是&#xff0c;撇开软件操作层面不谈&#xff0c;作为一个WebGIS/GIS开发人员&#xff0c;我们如何通过GIS开源框架去完成地理数据库的自动化解析和入库…

解决不同影像裁剪后栅格数据行列不一致问题

前言在处理栅格数据时&#xff0c;尽管用同一个矢量文件裁剪栅格数据&#xff0c;不同数据来源的栅格行列数也会出现不一致的情况。如果忽略或解决不好&#xff0c;会导致后续数据处理出现意想不到的误差或错误&#xff0c;尤其是利用编程实现数据处理时。因此&#xff0c;应当…

VisualGDB 5.6R9 FOR WINDOWS

Go cross-platform with comfort VisualGDB 是 Visual Studio 的一个非常强大的扩展&#xff0c;它允许您调试或调试嵌入式系统。这个程序有一个非常有吸引力的用户界面&#xff0c;它有许多调试或调试代码的功能。VisualGDB 还有一个向导可以帮助您调试程序&#xff0c;为您提…

【C++】关键字、命名空间、输入和输出、缺省参数、函数重载

C关键字(C98)命名空间产生背景命名空间定义命名空间使用输入&输出缺省参数什么叫缺省参数缺省参数分类函数重载函数重载概念C支持函数重载的原理--名字修饰C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字。 下面我们先看一下C有多少关键字&#xff0c;不对关键…