算法打卡day39

今日任务:

1)卡码网57. 爬楼梯(70. 爬楼梯进阶版)

2)322.零钱兑换

3)279.完全平方数

4)复习day14

卡码网57. 爬楼梯(70. 爬楼梯进阶版)

题目链接:57. 爬楼梯(第八期模拟笔试) (kamacoder.com)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。输入描述:输入共一行,包含两个正整数,分别表示n, m
输出描述:输出一个整数,表示爬到楼顶的方法数。输入示例:3 2
输出示例:3提示:
当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。
此时你有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶段
1 阶 + 2 阶
2 阶 + 1 阶

文章讲解:代码随想录 (programmercarl.com)

思路:

这是之前70爬楼梯的变体,之前70是只能至多爬两个台阶

这次改为:一步一个台阶,两个台阶,三个台阶,.......,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?

这其实是一个求排列组合的完全背包问题。

1阶,2阶,.... m阶就是物品,楼顶就是背包。

每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。

问跳到楼顶有几种方法其实就是问装满背包有几种方法。

  • 我们定义一个一维数组 dp,其中 dp[i] 表示爬到第 i 阶楼梯的方法数。初始状态 dp[0] = 1,因为爬到第 0 阶楼梯有一种方法,即不爬。
  • 然后我们从第 1 阶开始遍历到第 n 阶,对于每一阶楼梯,我们考虑可以从前面的 m 个楼梯中的任意一个跳过来,因此 dp[i] = dp[i-1] + dp[i-2] + ... + dp[i-m]
def climbing_stairs(n,m):# 背包总容量dp = [0]*(n+1)dp[0] = 1# 排列题,注意循环顺序,背包在外物品在内5for j in range(n+1):for i in range(1,m+1):if j >= i:dp[j] += dp[j - i] # 这里i就是物品重量而非indexreturn dp[-1]if __name__ == '__main__':n,m = list(map(int,input().split(' ')))print(climbing_stairs(n,m))

322.零钱兑换

题目链接:322. 零钱兑换 - 力扣(LeetCode)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
你可以认为每种硬币的数量是无限的。示例 1:
输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1示例 2:
输入:coins = [2], amount = 3
输出:-1示例 3:
输入:coins = [1], amount = 0
输出:0示例 4:
输入:coins = [1], amount = 1
输出:1示例 5:
输入:coins = [1], amount = 2
输出:2提示:
1 <= coins.length <= 12
1 <= coins[i] <= 2^31 - 1
0 <= amount <= 10^4

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换哔哩哔哩bilibili

思路:

题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。

但是是求最小数硬币数,也就是说不涉及排列,所以这题我们应该先遍历物品,也就是硬币,再遍历背包容量

硬币可以重复,那我们应该从前往后遍历

1.确定dp数组以及下标的含义

dp[j]:凑足总额为j所需钱币的最少个数为dp[j]

2.确定递推公式

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])

所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。

递推公式: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的元素都是应该是最大值。

class Solution:def coinChange(self, coins: List[int], amount: int) -> int:# 初始化动态规划数组,初始值为正无穷,表示无法凑成任何金额dp = [float('inf')]*(amount+1)# 设置总金额为0时需要的硬币个数为0dp[0] = 0# 遍历硬币面额for coin in coins:# 从当前硬币面额开始,遍历到总金额,更新动态规划数组for j in range(coin,amount+1):# 动态规划转移方程,更新当前总金额所需的最少硬币个数dp[j] = min(dp[j],dp[j-coin]+1)# 如果最终总金额对应的动态规划数组值仍然是正无穷,则表示无法凑成总金额,返回-1# 否则返回最终总金额对应的动态规划数组值return -1 if dp[-1] == float('inf') else dp[-1]if __name__ == '__main__':obj = Solution()# coins,amount = [1, 2, 5],11# coins,amount = [2],3coins,amount = [1],0print(obj.coinChange(coins, amount))

279.完全平方数

题目链接:279. 完全平方数 - 力扣(LeetCode)

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。示例 1:
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4示例 2:
输入:n = 13
输出:2
解释:13 = 4 + 9提示:
1 <= n <= 10^4

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数哔哩哔哩bilibili

思路:

  1. 创建一个动态规划数组dp,其中dp[j]表示和为j的完全平方数的最少数量。
  2. 初始化dp数组,将dp[0]设置为0,其他元素设置为正无穷。
  3. 遍历从1到n的所有数num,对于每个数num,遍历从num*num到n的所有可能的和j。
  4. 对于每个可能的和j,更新dp[j],将其设置为dp[j]和dp[j-num*num]+1的较小值,表示如果选择当前的完全平方数num,所需的硬币数量。
  5. 最终返回dp[n]作为结果,表示和为n的完全平方数的最少数量。
class Solution:def numSquares(self, n: int) -> int:# 创建动态规划数组,dp[j]表示和为j的完全平方数的最少数量dp = [float('inf')]*(n+1)dp[0] = 0# 初始化和为0时的数量为0# 计算不超过n的最大完全平方数max_num = int(n ** 0.5) + 1# 遍历从1到n的所有可能的完全平方数for num in range(1,max_num + 1):# 遍历从num*num到n的所有可能的和for j in range(num*num,n+1):if j >= num*num:# 更新dp[j],选择较小的值表示当前和的最少数量dp[j] = min(dp[j],1+dp[j-num*num])return dp[-1]

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

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

相关文章

C语言(扫雷游戏)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

CSS基础:浮动(float)的3种方式,清除浮动3种方式的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

Splashtop Cloud RADIUS 解决方案入围教育技术奖

2024年4月17日 加利福尼亚州库比蒂诺 Splashtop 在简化随处办公的远程解决方案领域处于领先地位&#xff0c;该公司自豪地宣布最近入围了《教育技术文摘》&#xff08;EdTech Digest&#xff09;的“2024年教育技术奖”的“炫酷工具”决赛。教育科技奖成立于2010年&#xff0c…

vue的学习之用vue写一个hello,vue

根据以下步骤下载vue.js 介绍 — Vue.js 创建一个damo.html &#xff0c;引入vue.js即可 <body><div id"app">{{ message }}</div><!-- Vue --><!-- 开发环境版本&#xff0c;包含了有帮助的命令行警告 --><script src"js/vu…

mysql的DDL语言和DML语言

DDL语言&#xff1a; 操作数据库&#xff0c;表等&#xff08;创建&#xff0c;删除&#xff0c;修改&#xff09;&#xff1b; 操作数据库 1&#xff1a;查询 show databases 2:创建 创建数据库 create database 数据库名称 创建数据库&#xff0c;如果不存在就创建 crea…

opencv_5_图像像素的算术操作

方法1&#xff1a;调用库函数 void ColorInvert::mat_operator(Mat& image) { Mat dst; Mat m Mat::zeros(image.size(), image.type()); m Scalar(2, 2, 2); multiply(image, m, dst); m1 Scalar(50,50, 50); //divide(image, m, dst); //add(im…

Hdu1150 Machine Schedule【二分图最大匹配、最小点覆盖】

Machine Schedule 题意 有两台机器&#xff0c;机器 A A A 有 n n n 个模式&#xff0c;机器 B B B 有 m m m 个模式 有 k k k 个任务&#xff0c;第 i i i 个任务只能由机器 A A A 的模式 x x x 或机器 B B B 的模式 y y y 完成 问最少需要多少个模式才能完成所有任…

67条tips实战案例渗透测试大佬的技巧总结

67条tips实战案例渗透测试大佬的技巧总结。 Tips 1. 手动端口探测 nmap的-sV可以探测出服务版本&#xff0c;但有些情况下必须手动探测去验证 使用Wireshark获取响应包未免大材小用&#xff0c;可通过nc简单判断 eg. 对于8001端口&#xff0c;nc连接上去&#xff0c;随便输…

如何判别三角形和求10 个整数中最大值?

分享每日小题&#xff0c;不断进步&#xff0c;今天的你也要加油哦&#xff01;接下来请看题------> 一、已知三条边a&#xff0c;b&#xff0c;c能否构成三角形&#xff0c;如果能构成三角形&#xff0c;判断三角形的类型&#xff08;等边三角形、等腰三角形或普通三角形 …

AB5 点击消除

AB5 点击消除 可以用栈来解决。 当栈为空的时候&#xff0c;直接将字符入栈当栈非空的时候 当前字符与栈顶字符相同 出栈 当前字符与栈顶字符不同 入栈 重复上述2步即可。 栈在输出的时候不能从栈底开始输出&#xff0c;需要先把栈顶元素弹出并保存下来&#xff0c;在进行输…

Windows 的常用命令(不分大小写)

Net user &#xff08;查看当前系统所有的账户&#xff09; net user yourname password /add 添加新用户 net localgroup administrators yourname /add 添加管理员权限 net user yourname /delete 删除用户 net user 命令 [colorred]说明&#xff1a;以下命令仅限持管理员…

PLC_博图系列☞N=:在信号下降沿置位操作数

、 PLC_博图系列☞N&#xff1a;在信号下降沿置位操作数 文章目录 PLC_博图系列☞N&#xff1a;在信号下降沿置位操作数背景介绍N&#xff1a; 在信号下降沿置位操作数说明参数示例 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 N 背景介绍 这是一篇关于PLC编程的…