题目

给定不同面额的硬币 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+1results[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

动态规划 Leetcode 322 Coin Change(零钱兑换)相关推荐

  1. leetcode 322. Coin Change | 322. 零钱兑换(动态规划)

    题目 https://leetcode.com/problems/coin-change/ 题解 也许是第一次在没看答案的情况下写的动态规划- 第一反应是,这题不是广义背包吗?想了一下,不是,因为广义 ...

  2. LeetCode 322. Coin Change

    原题 You are given coins of different denominations and a total amount of money amount. Write a functi ...

  3. leetcode 322. Coin Change-硬币交换|动态规划

    原题链接:322. Coin Change [思路-Java] 本题考查动态规划.也许一开始很容易想到用贪心算法,但是贪心算法在某些情况下是不成立的,比如coins = [1, 3, 5, 6],要a ...

  4. LeetCode 518 Coin Change 2 (python)

    目录 LeetCode 518 Coin Change 2 (python) Code 欢迎一起来参与leetcode刷题项目 LeetCode 518 Coin Change 2 (python) ...

  5. 动态规划思路和Python解决零钱兑换问题和最大乘积子序列的乘积的问题

    动态规划(Dynamic Programming)思路和Python解题示例 动态规划是一种主要用来优化朴素递归的方法,每当输入不同值调用递归函数出现大量重复的(子)输入和调用(返回结果)时,就可以考 ...

  6. [Leetcode][第322题][JAVA][零钱兑换][回溯][记忆化搜索][动态规划]

    [问题描述][中等] [解答思路] 1. 递归(超时) class Solution {int res = Integer.MAX_VALUE;public int coinChange(int[] ...

  7. 【LeetCode每周算法】零钱兑换

    题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/coin-change 给你一个整数数组 coins ,表示不同面额的硬币:以及一个整数 a ...

  8. 【Leetcode】Coin Change

    题目链接:https://leetcode.com/problems/coin-change/ 题目: You are given coins of different denominations a ...

  9. leetcode刷题:零钱兑换

    题目: 分析: 背包问题: 背包问题是动态规划非常重要的一类问题,它有很多变种,但题目千变万化都离不开我根据力扣上背包问题的题解和一些大佬的经验总结的解题模板 背包定义: 那么什么样的问题可以被称作为 ...

最新文章

  1. Altium Designer将Gerber转换为PCB文件教程
  2. 离散信号与系统分析(上)
  3. 存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20
  4. Debug Tensorflow: yolo模型检测框位置正确但类别不正确
  5. android 大文本存储,Android操作文件存储信息 利用SharedReference存储信息(获取SDCARD大小)...
  6. es6 --- 自制迭代器
  7. Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目
  8. Docker 使用 docker push 命令将镜像推送到 Docker Hub 服务器上
  9. LCN分布式事务框架实战
  10. Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
  11. Linux系统各文件、目录介绍
  12. 临时上传的文件-20170707
  13. 调用远程摄像头进行人脸识别_【论文精选】基于人脸识别技术的燃气远程开户系统...
  14. python round用法_Python round 函数
  15. 我的漫漫程序人生路(真诚的长文,慎点)
  16. Springboot项目引入Bootstrap后,图标不能正常显示,报:Failed to decode downloaded font
  17. Spring学习笔记(完结)
  18. 智慧工地解决方案的关键技术
  19. 使用NVivo研究时,不得不注意的几点!
  20. api和gataway

热门文章

  1. 【项目案例】配置小型网络WLAN基本业务示例
  2. 5g的八大关键指标_5G关键性能指标解析
  3. Why won't MikuMikuDance load my AVI file background?
  4. cdn 中移集采_中兴通讯中标中国移动融合CDN四期集采新建项目最大份额
  5. STM32CUBE+自平衡车原理篇2.1-电池电压检测原理(ADC如何测量电压、温度)
  6. AVPlayer(一)AVPlayerItem
  7. 根据详细地址获取经纬度(通过高德API)
  8. 安装uve-cli,并使用vue ui可视化界面创建第一个vue项目
  9. chrome怎样编辑html页面大小,使用Chrome DevTools实时编辑HTML和CSS
  10. 搜索框、微信发红包、水杯、QQ登录、聊天窗口、两台电梯的测试用例