动态规划 Leetcode 322 Coin Change(零钱兑换)

2023-11-14

题目

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

链接(中文版):https://leetcode-cn.com/problems/coin-change

链接(英文版):https://leetcode.com/problems/coin-change

分析

用动态规划解题就是求出递推公式,对于本题,想求总金额为amount的答案(记为Answer(amount)),需要使用总金额小于amount的答案,即递推。

对某个硬币(记面额为coin),如果小于等于amount,则说明这个硬币可以组成amount,此时有两个答案:

使用该硬币的答案Answer(amount-coin)+1,其中Answer(amount-coin)是总金额为amount-coin(小于amount)的答案,+1表示使用coin这个硬币,所以硬币数量加1。

不使用该硬币的答案Answer(amount),即当前已有答案。初始化时,我们要把这个初始答案设为一个很大的数字,这里用amlount+1就行,因为最小的面额是1,如果最后Answer(amount)==amount+1,说明给定的硬币没法组成amount。

对于这两个答案,我们取较小的,赋给Answer(amount),然后继续判断其他的硬币,当全部硬币都处理完,就得到最优的Answer(amount)

代码

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        results = [amount + 1] * (amount + 1) #初始化全部答案为amount+1
        results[0] = 0 #第0个答案是0,循环从1开始
        for i in range(1, amount + 1): #依次计算1到amount的最优答案。这里是amount+1,因为range是左开右闭的
            for coin in coins: #每个最优答案的求取,都需要遍历全部的硬币
                if i >= coin: #如果某个硬币小于i,说明它可以是组成i的一部分
                    results[i] = min(results[i], results[i-coin] + 1) #是否使用这个硬币,取决于两个答案的大小
        # print(results) #至此,从1到amount的全部最优答案都有了
        return results[-1] if results[-1] <= amount else -1 #返回最有一个答案,即所求答案,如果它没有被更新过,说明它无法被组成,返回-1

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划 Leetcode 322 Coin Change(零钱兑换) 的相关文章

随机推荐

  • 找不到MSVCR120.dll

    问题 在windos平台启动Mysql5 7时提示 找不到MSVCR120 dll 无法执行代码 处理 安装对应的dll动态库程序 安装程序下载地址下载地址
  • DA转换原理及实现

    这一篇介绍D A转换原理以及在TX 1C上的接线方式 实现方法 再用一个例子来加深理解 D A转换原理及参数指标 1 基本原理 数字量是二进制代码数位组合而来的 每位都有一定的权重 在D A转换中 怎么样把这些权重以合适的方法表示出来是转换
  • 在ubuntu里面安装交叉编译工具(树莓派的)

    交叉编译是什么 为什么要交叉编译 交叉编译 是在一个平台上生成另一个平台上的可执行代码 我们再windows上面编写C51代码 并编译成可执行代码 如xx hex 是在c51上面运行 不是在windows上面运行我们在ubuntu上面编写树
  • ZYNQ图像处理项目——帧差法运动目标跟踪

    一 帧差法运动目标跟踪概述 1 1 基本原理 帧差法顾名思义就是对输入的前后两帧图像做差值 然后检测出两帧图像不同的地方 并且可以实时跟踪运动的目标轮廓 本设计是基于ZYNQ7010和VIVADO2018 3实现的帧差法运动目标检测 针对运
  • Flutter 30: 图解自定义底部状态栏 ACEBottomNavigationBar (一) ...

    小菜刚接触 Flutter 时接触到底部状态栏 BottomNavigationBar 方便快捷 但随着使用过程发现依然有一些限制 包括图片选择 样式凸出 固定 NavigationItem 位等 小菜不才 准备照葫芦画瓢 自定义一个底部状
  • PowerDesigner链接Oracle导出数据模型,并且显示中文注释

    1 首先新建模型 选择物理数据模型 2 对新建模型命名 选择对应的数据库版本 3 选中新建的模型图 选择从数据库更新模型 4 选择使用数据源 5 新建数据源 如果在当前页面无法选择系统数据源 说明当前软件不是在管理员模式下运行的 退出 重新
  • dataframe列时间字段提取年、月、日、时、分

    dataframe列的 日期时间 进行提取对应的年月日时分 import pandas as pd df pd read csv file encoding utf 8 sig dateframe 日期数据 字符型转换成日期格式 df 日期
  • 日语学习之——拗音

    前言 本文主要介绍日语学习中的拗音 拗音的拼写及发音准则 拗音 33个 发音原则 段假名 小写 一 行 1 1 行 kya 第1行 元音行 段 段 段 行 kya kyu kyo 1 2 相关单词 假名 日本汉字 中文意思 外来语 取消 和
  • int *const p和 int const *p 的区别

    1 对于int const p const 限定的是p所指的对象 所以p指针所指的地址在这个情况下是不能改变的 2 对于 int const p const限定的是 p 所以 p所指的值是不可以改变的 但是可以改变p所指的对象 3 更多的列
  • buuctf-[极客大挑战 2019]LoveSQL1(小宇特详解)

    buuctf 极客大挑战 2019 LoveSQL1 小宇特详解 1 这里有账号和密码 这里先尝试一下万能密码 在账号那里注入 1 or 1 1 密码随便 这里继续进行注入 判断有几列 1 order by 3 这里试一试4 1 order
  • 马氏距离例题详解(全网最详细)

    马氏距离例题详解 定义 马哈拉诺比斯距离是由印度统计学家马哈拉诺比斯 英语 提出的 表示数据的协方差距离 它是一种有效的计算两个未知样本集的相似度的方法 与欧氏距离不同的是它考虑到各种特性之间的联系 例如 一条关于身高的信息会带来一条关于体
  • 云安全威胁和责任

    云计算的共享特性和按需定制本质除了给企业带来效率上提升 也引入了新的安全威胁 有可能使企业得不偿失 之前云安全联盟 CSA 的报告便指出 云服务天生就能使用户绕过公司范围内的安全策略 建立起自己的影子IT项目服务账户 新的安全控制策略必须被
  • 访问者模式(Visitor)

    设计模式系列 Visitor 访问者模式 对象行为模式 1 意图 表示一个作用于某对象结构中的各元素的操作 它使你可以在不改变各元素的类的前拐下定义作用于这些元素的新操作 2 适用性 在下列情况下使用Visitor模式 一个对象结构包含很多
  • 数字水印技术:概念、应用及现状

    出处 伯晓晨 沈林成 常文森 一 引言 随着信息时代的到来 特别是Internet的普及 信息的安全保护问题日益 突出 当前的信息安全技术基本上都以密码学理论为基础 无论是采用传统的密钥系统 还是公钥系统 其保护方式都是控制文件的存取 即将
  • java.lang.NoSuchMethodError: org.apache.curator.framework.api.CreateBuilder.creatingParentsIfNeeded(...

    1 错误信息 java lang NoSuchMethodError org apache curator framework api CreateBuilder creatingParentsIfNeeded Lorg apache cu
  • shell无限死循环

    学习shell脚本 练习脚本时 每次测试脚本都需要重新打开文件 为了方便就想到了死循环 想到shell脚本是基于C语言和C 编写的 顺着想法试了一通C循环方法 没对一个 经过网上大佬们的文章学习 学习到了while循环和for循环 记录一下
  • 九、基本数据类型-浮点类型

    如果 我们 创建了 一个浮点类型的变量 那么 这个变量 就可以用来 存储 浮点类型的数据 也就是 含有小数数位的数据 如果 一个数字 含有 小数点 以及 后面的数位 那么 这个数字 就属于 浮点类型 如果 小数点前面 或者 后面的数位 是
  • Java8对list排序(正序倒序)

    话不多说直接上干货 这里我写了一个list数组里边add了三个Order实体 我的ucId price qty都是int类型 第一个实例 我对price进行从小到大的排序 我的price是int类型 显然这里的第一种方式已经给出提示了 让使
  • Matlab实现Bi-Kmeans算法(每行代码标注详细注解)

    逐行代码讲解Bi Kmeans算法的原理及其实现 后续将更新该算法的进一步优化的代码的讲解 目录 一 什么是Kmeans 算法 二 bi kmeans算法原理 三 bi kmeans算法代码解析 四 总结 一 什么是Kmeans 算法 K
  • 动态规划 Leetcode 322 Coin Change(零钱兑换)

    题目 给定不同面额的硬币 coins 和一个总金额 amount 编写一个函数来计算可以凑成总金额所需的最少的硬币个数 如果没有任何一种硬币组合能组成总金额 返回 1 链接 中文版 https leetcode cn com problem