算法打卡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

    # 排列题,注意循环顺序,背包在外物品在内5
    for j in range(n+1):
        for i in range(1,m+1):
            if j >= i:
                dp[j] += dp[j - i] # 这里i就是物品重量而非index

    return 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时需要的硬币个数为0
        dp[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],3
    coins,amount = [1],0
    print(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]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构从入门到实战——顺序表的应用

目录 一、基于动态顺序表实现通讯录 二、代码实现 2.1 通讯录的初始化 2.2 通讯录的销毁 2.3 通讯录的展示 2.4 通讯录添加联系人信息 2.5 通讯录删除联系人信息 2.6 通讯录修改联系人信息 2.7 通讯录的查找联系人信息 2.8 将通讯录中联系人信息保存到文件中 2.9…

乡政府管理系统|基于Springboot的乡政府管理系统设计与实现(源码+数据库+文档)

乡政府管理系统目录 目录 基于Springboot的乡政府管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、活动信息管理 3、新闻类型管理 4、新闻动态管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

考研党们,搭子们,打打鸡血!刷视频免疫了,时间竟然多了起来!——早读(逆天打工人爬取热门微信文章解读)

断舍离&#xff0c;断的是过去 引言Python 代码第一篇 人民日报 一个班级&#xff0c;29人全部“上岸”&#xff01; 第二篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 时间就像河流 它带来一切 也带走一切 不打游戏不刷视频 时间的河流便能带来更丰富的体验 引言…

PSO-GPR单变量时序预测-递归预测未来数据 基于粒子群算法-高斯过程回归递归预测未来数据

文章目录 效果一览文章概述订阅专栏只能获取一份代码部分源码参考资料效果一览 文章概述 PSO-GPR单变量时序预测-递归预测未来数据 基于粒子群算法-高斯过程回归递归预测未来数据 订阅专栏只能获取一份代码 部分源码 %

Java对象克隆-浅拷贝与深拷贝

目录 1、对象的克隆 1.1 对象的浅拷贝 1.2 对象深拷贝 1、对象的克隆 1.1 对象的浅拷贝 在实际编程过程中&#xff0c;我们常常要遇到这种情况&#xff1a;有一个对象A&#xff0c;在某一时刻A中已经包含了一些有效值&#xff0c;此时可能会需要一个和A完全相同新对象B&am…

PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)

一、实现逻辑 本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的.exe,如果有,下载最新的.exe安装升级。 本实例服务端待下载.exe所在目录结构 本实例客户端待更新.exe所在目录结构 二、搭建服务器 可以参考…

springcloud第4季 springcloud-alibaba之sentinel

一 sentinel介绍 1.1 sentinel作用 sentinel是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。 1.2 组成部分 sen…

学习Rust的第11天:模块系统

Today we are taking a look at the module system of rust. We can use this to manage growing projects and keep track of what modules is stored where… 今天我们来看看Rust的模块系统。我们可以使用它来管理不断增长的项目&#xff0c;并跟踪 modules 存储在何处。 Rus…

MyBatis使用PageHelper分页插件

1、不使用PageHelper分页插件 模块名&#xff1a;mybatis-012-page CarMapper接口package org.example.mapper;import org.apache.ibatis.annotations.Param; import org.example.pojo.Car;import java.util.List;public interface CarMapper {/*** 分页查询* param startInd…

LLMs之Llama3:Llama 3的简介、安装和使用方法、案例应用之详细攻略

LLMs之Llama3&#xff1a;Llama 3的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年4月18日&#xff0c;Meta 重磅推出了Meta Llama 3&#xff0c;本文章主要介绍了Meta推出的新的开源大语言模型Meta Llama 3。模型架构 Llama 3 是一种自回归语言模型&#x…

1000w背后的故事!

如果只让提一个合作中不靠谱的事&#xff0c;我想说&#xff0c;只要说钱不是问题的&#xff0c;都不靠谱。 因为我经历过的&#xff0c;钱不是问题也有顺利合作的&#xff0c;但绝大多数都是出现在钱的问题上。 我现在最怕就是熟人找来做项目&#xff0c;说多钱你说&#xff0…

在jsp里或servlet里将时间修改为类似“2023年 8月 03日 时间:23:13:49 星期四”形式

jsp 例如&#xff0c;从数据库读到的EL表达式的时间形式为Thu Aug 03 23:13:49 CST 2023 在jsp这边用<script>将获得的EL表达式修改为类似“2023年 8月 03日 时间:23:13:49 星期四”形式展现在网页上 <c:forEach items"${sessionScope.SecurityManagementlist}…

ubuntu18.04安装F4PGA教程

环境搭建教程&#xff1a; f4pga-arch-defs/xilinx/xc7 at main f4pga/f4pga-arch-defs GitHub git clone https://github.com/SymbiFlow/f4pga-arch-defs.git cd f4pga-arch-defs make env cd build 主要是make env&#xff0c;会下载很多东西&#xff0c;然后生成很多描…

前端开发与html学习笔记

一、前端开发概述 前端开发&#xff1a;也叫做web前端开发&#xff0c;它指的是基于web的互联网产品的页面(也可叫界面)开发及功能开发互联网产品&#xff1a;指网站为满足用户需求而创建的用于运营的功能及服务&#xff0c;百度搜索、淘宝、QQ、微博、网易邮箱等都是互联网产…

3.2 iHRM人力资源 - 组织架构 - 编辑及删除

iHRM人力资源 - 组织架构 文章目录 iHRM人力资源 - 组织架构一、编辑功能1.1 表单弹层并数据回显1.2 编辑校验1.3 编辑 二、删除功能 一、编辑功能 编辑功能和新增功能用的组件其实是一个&#xff0c;结构几乎是一样的&#xff0c;其实是复用了组件&#xff0c;我们也省去了很…

(十六)call、apply、bind介绍、区别和实现

函数中的this指向&#xff1a; 函数中的this指向是在函数被调用的时候确定的&#xff0c;也就是执行上下文被创建时确定的。在一个执行上下文中&#xff0c;this由调用者提供&#xff0c;由调用函数的方式来决定。 类数组对象arguments&#xff1a; arguments只在函数&#…

二叉检索树 及 插入方法的图解、实现、时间代价分析

1、二叉检索树&#xff1a; &#xff08;1&#xff09;定义 二叉检索树的任意一个结点&#xff0c;设其值为k&#xff0c;则该节点左子树中任意一个结点的值都小于k&#xff1b;该节点右子树中任意一个节点的值都大于或等于k 这里的比较规则可以是针对数字的&#xff0c;也可…

工程上有哪些实用且简单的滤波方法?

一、工程滤波 在工程实践过程中&#xff0c;以下是一些常用的滤波方法及其优缺点&#xff1a; 限幅滤波 优点&#xff1a;简单易行&#xff0c;能够有效去除突变的大噪声&#xff0c;保护后续电路和传感器不受损伤。 缺点&#xff1a;可能会丢失信号的真实峰值&#xff0c;对真…

有关栈的练习

栈练习1 给定一个栈&#xff08;初始为空&#xff0c;元素类型为整数&#xff0c;且小于等于 109&#xff09;&#xff0c;只有两个操作&#xff1a;入栈和出栈。先给出这些操作&#xff0c;请输出最终栈的栈顶元素。 操作解释&#xff1a; 1 表示将一个数据元素入栈&#xff…

平衡二叉树(后序遍历,力扣110)

解题思路&#xff1a;采取后序遍历的好处是先遍历节点得到高度&#xff0c;然后再判断高度差是否大于一&#xff0c;如果是的话就返回-1&#xff0c;不是就返回两高度中较大的高度加一就是父节点的高度 具体代码如下&#xff1a; class Solution { public: int travel(TreeN…