题目:

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。

 解答:这里我们以第一个示例演示,分别画出每种金额的树形结构,如下

这里我们采取一种自下而上的方法,这里我重点解释代码中一个公式:

dp[i]=min(dp[i],dp[i-e]+1);

dp[i]:表示不同的金额下所需最少的钱币数

dp[i-e]+1:这里i-e表示当前金额减去一种面值后金额,dp[i-e]的值一定代表i-e时所需要的最小的钱币数这个值我们之前一定算过),因为最开始就是从金额是0开始递增来计算不同金额所需的最小钱币数,这里的e表示不同的面值的大小,正因为我们减去了一枚钱币,所以后面要加个1,所以dp[i-e]+1表示的就是当前所耗费的钱币数啊!!!

dp[]是一个数组,并且数组里的值都被表示为很大的数,dp[i-e]+1表示钱币数一定会代替当前的dp[i],没错吧,之后我们计算每个dp[i-e]+1的数量,将最小的保存下来就可以啦!最后在计算大一个金额的,以此类推。

可以结合上面的树形图去观察,会发现每个树杈下面都是之前算过的,其实就是在遍历每个树杈子,例如 计算amount =4时,我们直接就比较3 和 2所用的钱币数就可以啦(其实就是dp[2]和dp[3]),不用重复计算,这就是自下而上的好处!!

class Solution {
public:int coinChange(vector<int>& coins, int amount) {if(amount==0) return 0;int dp[10005];for(auto& i: dp) i=10006;dp[0] = 0;//这一步求出我们要计算金额之前每种金额需要的最少钱币数for(int i=0; i<=amount; i++) {//这里是遍历每个硬币的面值for(auto& e: coins) {//用总金额-硬币面值if(i-e>=0) dp[i]=min(dp[i],dp[i-e]+1);}}return dp[amount]>=10006? -1: dp[amount];}};

血战力扣 332.零钱兑换相关推荐

  1. 力扣332. 重新安排行程(JavaScript)

    var findItinerary = function(tickets) {let arr=['JFK']let map={} //在空对象中添加属性和属性值:{'起始城市':[到达的城市]}for ...

  2. 血战力扣752.打开转盘锁

    你有一个带有四个圆形拨轮的转盘锁.每个拨轮都有10个数字: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' .每个拨轮可以自由旋转:例如把 '9' 变 ...

  3. day45爬楼梯进阶_零钱兑换_完全平方数

    力扣70.爬楼梯 题目链接:https://leetcode.cn/problems/climbing-stairs/ ##思路 本题和组合总和4相像,先迈一个台阶再迈两个台阶,和先迈两个台阶再迈一个 ...

  4. 力扣刷题记录-动态规划问题总结

    百度百科里对于动态规划问题是这样解释的: 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.因此各个阶段 ...

  5. 力扣刷题记录-回溯算法相关题目

    首先介绍一下回溯算法 回溯通常在递归函数中体现,本质也是一种暴力的搜索方法,但可以解决一些用for循环暴力解决不了的问题,其应用有: 1.组合问题: 例:1 2 3 4这些数中找出组合为2的组合,有1 ...

  6. golang力扣leetcode 322.零钱兑换

    322.零钱兑换 322.零钱兑换 题解 代码 322.零钱兑换 322.零钱兑换 题解 //state: dp[i]金额为i时所需最少硬币个数 //function: dp[i]=dp[i-n]+1 ...

  7. python【力扣LeetCode算法题库】322-零钱兑换(动态规划)

    零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: co ...

  8. c++ 多重背包状态转移方程_背包问题之零钱兑换

    读完本文,你可以去力扣拿下如下题目: 518.零钱兑换II ----------- 零钱兑换 2 是另一种典型背包问题的变体,我们前文已经讲了 经典动态规划:0-1 背包问题 和 背包问题变体:相等子 ...

  9. LeetCode 518. 零钱兑换 II(动态规划)

    1. 题目 给定不同面额的硬币和一个总金额. 写出函数来计算可以凑成总金额的硬币组合数. 假设每一种面额的硬币有无限个. 示例 1: 输入: amount = 5, coins = [1, 2, 5] ...

最新文章

  1. GHOST还原教程详细
  2. Linux系统起源及主流发行版
  3. bilibili有电脑版吗_虚充制冷剂、谎称电脑版故障...空调维修的这些套路,你 中招了吗...
  4. 前台提示_提示一下大家,如果考试科目不合格,可以到前台自助机查询
  5. 如何在window上把你的项目提交到github
  6. 回归分析假设_回归分析假设的最简单指南
  7. byteofpython.info_A Byte of Python 笔记(7)数据结构:列表、元组、字典,序列
  8. jupyter 服务器 显示不完全,Jupyter中显示DataFrame的行显示不完全
  9. android.content.res.Resources$NotFoundException: String resource ID #0x0
  10. linux服务器上怎么运行exe,用Linux服务器运行exe文件
  11. java实习几个月没有项目组_Java实习报告总结范文3篇
  12. 关于NI美国国家仪器音频分析器使用技巧(4461音频分析仪)
  13. java rgb565转rgb888_RGB565 转RGB888的循环补偿(zz)
  14. Excel VBA编程实现自动分页
  15. Swift使用UserDefaults存储,报错 Fatal error: ‘try‘ expression unexpectedly raised an error: Swift.Decoding
  16. 哪些App适合用HTML5开发?
  17. selenium之鼠标操作详解
  18. Spine 实用技巧大全
  19. 2022年美赛e题资料(森林固碳)
  20. Termux网络文件管理器——filebrowser

热门文章

  1. 什么是Mysql的next-key、插入缓冲、二次写、自适应哈希索引和预读
  2. 原生JS制作抽奖小游戏
  3. abp .net core linux,Abp vNext框架 从空项目开始 使用ASP.NET Core Web Application-笔记
  4. Python+Appium+夜神模拟器 全流程从环境搭建到实现自动化(APP自动化)
  5. Acwing4269. 校庆
  6. DR5加强版2019全新 | PS磨皮插件高端人像后期修图工具
  7. laravel ckeditor上传图片
  8. axios中的put和patch有什么区别
  9. learning的反义词英文_英语同义词反义词
  10. 智学.com查成绩 html,智学网成绩查询入口:https://www.zhixue.com/login.html