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

news/2025/2/16 6:28:54/

动态规划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.ppmy.cn/news/1357049.html

相关文章

从零开始手写mmo游戏从框架到爆炸(十四)— 英雄和野怪

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 之前都是模板的创建&#xff0c;现在我们来创建英雄和野怪。 枚举类 首先创建几个枚举类&#xff0c;定义野怪的品质和血统等。 LevelExpEnum - 每升一级需要的经验 …

SpringBoot+Vue+MySQL:图书管理系统的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

docker安装milvus后,无法打开attu,日志报错

背景&#xff0c;在虚拟机用docker安装milvus后&#xff0c;正常访问attu&#xff0c;过段时间挂机后无法访问 日志报错&#xff1a; [2024/02/19 06:59:46.761 00:00] [ERROR] [grpcclient/client.go:330] ["ClientBase ReCall grpc second call get error"] [rol…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Menu组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Menu组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Menu组件 以垂直列表形式显示的菜单。 子组件 包含MenuItem、MenuItemGroup子组…

ChatGLM的Trainer模块解析

Trainer类 为什么这样比较好 Trainer是一个简单但功能完备的PyTorch训练和评估循环&#xff0c;针对&#x1f917; Transformers进行了优化。 参数: model: [PreTrainedModel]或torch.nn.Module类型&#xff0c;可选。用于训练、评估或预测的模型。如果未提供&#xff0c;则…

Springboot之压缩逻辑源码跟踪流程

背景 在项目开发过程中&#xff0c;前后端参数比较多&#xff0c;导致网络传输耗时比较多&#xff0c;因此想将数据压缩传输&#xff0c;以减少网络传输的耗时&#xff0c;从而减少接口的响应时间&#xff0c;可以自己实现&#xff0c;但是spring相关的框架已经内置了该功能&am…

平台+低代码:中小企业数字化转型普惠之路

随着数字化转型的深入推进&#xff0c;中小企业面临着数字化转型的压力和挑战。如何在有限的资源和条件下&#xff0c;实现高效、便捷的数字化转型&#xff0c;成为中小企业亟待解决的问题。本文将以“平台低代码”为主题&#xff0c;探讨中小企业数字化转型的新模式&#xff0…

conda与pip的常用命令

conda的常用命令 1.查看conda版本 $ conda --version conda 23.11.02.查看conda的配置信息 $ conda infoactive environment : baseactive env location : /home/myPc/miniconda3shell level : 1user config file : /home/myPc/.condarcpopulated config files : conda vers…