代码随想录算法训练营第50天(动态规划07 ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数

动态规划part07

  • 70. 爬楼梯 (进阶)
    • 解题思路
    • 总结
  • 322. 零钱兑换
    • 解题思路
    • 总结
  • 279.完全平方数
    • 解题思路

70. 爬楼梯 (进阶)

这道题目 爬楼梯之前我们做过,这次再用完全背包的思路来分析一遍
文章讲解: 70. 爬楼梯 (进阶)

解题思路

我们之前做的 爬楼梯 是只能至多爬两个台阶。
这次改为:一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?
这又有难度了,这其实是一个完全背包问题。
1阶,2阶,.... m阶就是物品,楼顶就是背包。
每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。
问跳到楼顶有几种方法其实就是问装满背包有几种方法。
此时大家应该发现这就是一个完全背包问题了!
和题目动态规划:377. 组合总和 Ⅳ基本就是一道题了。

import java.util.Scanner;
class climbStairs{public static void main(String [] args){Scanner sc = new Scanner(System.in);int m, n;while (sc.hasNextInt()) {// 从键盘输入参数,中间用空格隔开n = sc.nextInt();m = sc.nextInt();// 求排列问题,先遍历背包再遍历物品int[] dp = new int[n + 1];dp[0] = 1;for (int j = 1; j <= n; j++) {for (int i = 1; i <= m; i++) {if (j - i >= 0) dp[j] += dp[j - i];}}System.out.println(dp[n]);}}
}

总结

本题看起来是一道简单题目,稍稍进阶一下其实就是一个完全背包!
如果我来面试的话,我就会先给候选人出一个 本题原题,看其表现,如果顺利写出来,进而在要求每次可以爬[1 - m]个台阶应该怎么写。
顺便再考察一下两个for循环的嵌套顺序,为什么target放外面,nums放里面。
这就能考察对背包问题本质的掌握程度,候选人是不是刷题背公式,一眼就看出来了。
这么一连套下来,如果候选人都能答出来,相信任何一位面试官都是非常满意的。
本题代码不长,题目也很普通,但稍稍一进阶就可以考察完全背包,而且题目进阶的内容在leetcode上并没有原题,一定程度上就可以排除掉刷题党了,简直是面试题目的绝佳选择!

322. 零钱兑换

如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
这句话结合本题 大家要好好理解。
题目链接: 322. 零钱兑换
视频讲解: 322. 零钱兑换
文章讲解: 322. 零钱兑换

解题思路

题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题
动规五部曲分析如下:

  1. 确定dp数组以及下标的含义
    dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
  2. 确定递推公式
    递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
  3. dp数组如何初始化
    首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0;
    考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。
    所以下标非0的元素都是应该是最大值。
  4. 确定遍历顺序
    本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。
    所以本题并不强调集合是组合还是排列。
  5. 举例推导dp数组

总结

动态规划:518.零钱兑换II 中求的是组合数,动态规划:377. 组合总和 Ⅳ 中求的是排列数。
而本题是要求最少硬币数量,硬币是组合数还是排列数都无所谓!所以两个for循环先后顺序怎样都可以!

// 动态规划 完全背包
class Solution {public int coinChange(int[] coins, int amount) {int max = Integer.MAX_VALUE;int[] dp = new int[amount + 1];//初始化dp数组为最大值for(int j = 0; j < dp.length; j++){dp[j] = max;}// 当金额为0时需要的硬币数目为0dp[0] = 0;for(int i = 0; i < coins.length; i++){//正序遍历:完全背包每个硬币可以选择多次for(int j = coins[i]; j <= amount; j++){if(dp[j - coins[i]] != max){// 选择硬币数目最小的情况dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}}}return dp[amount] == max ? -1 : dp[amount];}
}

279.完全平方数

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做
题目链接: 279.完全平方数
视频讲解: 279.完全平方数
文章讲解: 279.完全平方数

解题思路

和昨天的题目动态规划:322. 零钱兑换 是一样一样的!


class Solution {// 版本一,先遍历物品, 再遍历背包public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];//初始化for (int j = 0; j <= n; j++) {dp[j] = max;}//如果不想要寫for-loop填充數組的話,也可以用JAVA內建的Arrays.fill()函數。//Arrays.fill(dp, Integer.MAX_VALUE);//当和为0时,组合的个数为0dp[0] = 0;// 遍历物品for (int i = 1; i * i <= n; i++) {// 遍历背包for (int j = i * i; j <= n; j++) {//if (dp[j - i * i] != max) {dp[j] = Math.min(dp[j], dp[j - i * i] + 1);//}//不需要這個if statement,因爲在完全平方數這一題不會有"湊不成"的狀況發生( 一定可以用"1"來組成任何一個n),故comment掉這個if statement。}}return dp[n];}
}

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

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

相关文章

用163邮箱或者outlook接收国科大邮箱的邮件

使用如图下路径&#xff0c;创建一个新的密码&#xff0c;用于在163大师邮箱或者outlook登录即可 如果不行&#xff0c;则需要手动配置邮箱服务器 参考网址&#xff1a;中国科学院邮件系统帮助中心

人工智能_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_001---人工智能工作笔记0096

使用centos安装,注意安装之前,保证系统可以联网,然后执行yum update 先去更新一下系统,可以省掉很多麻烦 20240219_150031 这里我们使用centos系统吧,使用习惯了. ChatGlm首先需要一台个人计算机,或者服务器, 要的算力,训练最多,微调次之,推理需要算力最少 其实很多都支持C…

SpringBoot的 8 个优点

目录 1、简化配置 2、快速开发 3、微服务支持 4、内嵌服务器 5、健康监测 6、热部署 7、自动化管理 8、社区支持和生态系统 SpringBoot 是一个基于 Spring 框架的快速开发框架&#xff0c;它通过提供一系列的自动配置、约定优于配置、快速集成等功能&#xff0c;简化了…

Hive切换引擎(MR、Tez、Spark)

Hive切换引擎(MR、Tez、Spark) 1. MapReduce计算引擎(默认) set hive.execution.enginemr;2. Tez引擎 set hive.execution.enginetez;1. Spark计算引擎 set hive.execution.enginespark;

探索LightGBM:类别特征与数据处理

导言 LightGBM是一种高效的梯度提升决策树算法&#xff0c;常用于分类和回归任务。在实际应用中&#xff0c;数据通常包含各种类型的特征&#xff0c;其中类别特征是一种常见的类型。本教程将详细介绍如何在Python中使用LightGBM处理类别特征和数据&#xff0c;包括数据预处理…

借助Aspose.BarCode条码控件,C# 中的文本转 QR 码生成器

二维码用于在较小的空间内存储大量数据。它们易于使用&#xff0c;可以通过智能手机或其他设备扫描来打开网站、观看视频或访问其他编码信息。在这篇博文中&#xff0c;我们将学习如何使用 C# 以编程方式生成基于文本的 QR 码。我们将提供分步指南和代码片段&#xff0c;帮助您…

嵌入式学习 Day20

一. 标准IO和文件IO的区别: 1.标准IO是库函数,是对系统调用的封装 2.文件IO是系统调用,是Linux内核中的函数接口 3.标准IO是有缓存的 4.文件IO是没有缓存的 IO: b c d - 标准IO l s p 二. 文件IO: 1.操作步骤&#xff1a; …

Java中基于Session登录验证

1. 基于Session的登录验证 基于Session的登录验证方式是最简单的一种登录校验方式。 为啥能用Session作为登录验证的一种方式&#xff0c;因为每个用户的请求都会有一个Session&#xff0c;这个对象是Servlet给我们创建的&#xff0c;不需要我们手动创建&#xff0c;并且这个…

Unity之XR Interaction Toolkit如何在VR中实现一个可以拖拽的UI

前言 普通的VR项目中,我们常见的UI都是一个3D的UI,放置在场景中的某个位置,方便我们使用射线点击。但是为了更好的体验,我们可能会有跟随头显的UI,或者可拖拽的UI,这样更方便用户去操作。 所以我们今天的需求就是:如何基于XR Interaction Toolkit 插件 在VR中使用手柄射…

zip解压缩

使用unzip库可以轻松解压zip文件&#xff0c;源码下载地址&#xff1a;http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win #include <Windows.h> #include"unzip.h" SetCurrentDirectory("c:\\"); HZIP hz OpenZip(…

AlexNet的出现推动深度学习的巨大发展

尽管AlexNet&#xff08;2012&#xff09;的代码只比LeNet&#xff08;1998&#xff09;多出几行&#xff0c;但学术界花了很多年才接受深度学习这一概念&#xff0c;并应用其出色的实验结果。 AlexNet&#xff08;由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同设计…

OpenAI 发布文生视频Sora大模型,一句话便可生成长达一分钟的视频

前几期的文章&#xff0c;我们介绍了很多文生视频的大模型&#xff0c;包括字节发布的magic video以及stable video diffusion等模型&#xff0c;都可以输入相关的文本生成对应场景的视频。 文生视频大模型必然会成为各个人工智能大厂竞争的核心领地&#xff0c;这不OpenAI刚刚…

代码随想录算法训练营第三十六天|435. 无重叠区间、763. 划分字母区间、56. 合并区间。

435. 无重叠区间 题目链接&#xff1a;无重叠区间 题目描述&#xff1a; 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 解题思路&#xff1a; 本题和上一个射气球类似&#x…

什么是接口测试?怎么做接口测试?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种…

红旗linux安装32bit依赖库

红旗linux安装32bit依赖库 红旗linux安装32bit依赖库 lib下载 红旗-7.3-lib-32.tar.gz 解压压缩包&#xff0c;根据如下进行操作 1.回退glibc(1)查看当前glibc版本[root192 ~]# rpm -qa | grep glibcglibc-common-2.17-157.axs7.1.x86_64glibc-headers-2.17-260.axs7.5.x86_…

【手写数据库toadb】表relation访问实现概述,分层设计再实践,表访问层与表操作层简化代码复杂度

301表的访问 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学…

Python Flask高级编程之RESTFul API前后端分离(学习笔记)

Flask-RESTful是一个强大的Python库&#xff0c;用于构建RESTful APIs。它建立在Flask框架之上&#xff0c;提供了一套简单易用的工具&#xff0c;可以帮助你快速地创建API接口。Flask-RESTful遵循REST原则&#xff0c;支持常见的HTTP请求方法&#xff0c;如GET、POST、PUT和DE…

单机环境搭建Redis伪集群

1、Redis版本 [rootwsdhla ~]# redis-server -v Redis server v6.2.6 sha00000000:0 mallocjemalloc-5.1.0 bits64 buildbf23dac15dfc00fa[rootwsdhla ~]# redis-cli -v redis-cli 6.2.62、创建节点目录 创建6个节点目录&#xff0c;分别复制一份redis.conf并编辑&#xff1a…

Codeforces Round 927 (Div. 3)(A,B,C,D,E,F,G)

这场简单些&#xff0c;E题是个推结论的数学题&#xff0c;沾点高精的思想。F是个需要些预处理的DP&#xff0c;G题是用exgcd算边权的堆优化dijkstra。C题有点骗&#xff0c;硬啃很难做。 A Thorns and Coins 题意&#xff1a; 在你的电脑宇宙之旅中&#xff0c;你偶然发现了…

找第K大数

输入N个整数&#xff0c;求第K大的数是哪个&#xff1f; 输入格式 第一行2个正整数&#xff1a;N和K&#xff0c;N范围在[1,100]&#xff0c;K范围在[1,N]。 第二行N个不同的正整数&#xff1a;范围在[1,10000]。 输出格式 一个整数。 输入/输出例子1 输入&#xff1a; 5…