首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从零钱兑换再看动态规划的套路

在昨天的文章关于背包问题的一点发散[1]之后,有小伙伴说感觉跟LeetCode上一道题零钱兑换[2]很像,但是又好像有点不一样,简单的暴力递归跟缓存优化都能做出来,就是自下而上的方法不怎么有思路。...本质上,遇到任何面值的硬币,对于任何需要换零的数目,我们都想用最少的硬币来完成。...2.当前硬币面额小于需要换零额度时,我们就用它来换零,在这种情况下,我们就需要拿到能换到剩余数额的最小硬币数。...原谅我不会画表格,当我们只有面值为一的硬币时,我们要还多少钱就要多少个硬币。...当我们有面值为1,2两种的硬币时,当我们对5进行兑换时,不选择2这个面值的话,dp[0][5]是5,也就是我们需要5个面值为1的硬币,而dp[1][3]是是2,那这种情况兑换硬币就只要3个。

45520

额,没想到,背包问题解题也有套路。。。

作者 | P.yh 来源 | 五分钟学算法 一、概述 背包问题是一类比较 特殊的动态规划 问题,这篇文章的侧重点会在答案的推导过程上,我们还是会使用之前提到的解动态规划问题的四个步骤来思考这类问题。...题目来源:https://leetcode-cn.com/problems/coin-change-2/ 题目描述 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。...假设每一种面额的硬币有无限个。...如果没有这个 k,我相信你会很直接地想到使用 01 背包问题 的解法,那我们可以思考一下,基于原来的解法,如果增加了 k 这个限制,我们需要额外做些什么事情呢?...因为 k 会决定问题的状态,因此我们的状态数组中也要考虑 k,在考虑将第 k 个元素放入背包中,我们需要看的是背包中存放 k - 1 个元素的情况,这么看来,其实相比普通的 01 背包问题,这道题目仅仅是增加了一维状态

97621
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    破解大厂最难算法命面试:动态规划之硬币兑换

    在动态规划问题中,有一个很常见的问题就是最少硬币兑换。假设当前有面额为1,2,5元的硬币,然后给你一定额度,要求你将额度兑换成等值硬币,并要求兑换硬币的数量要最少。...最顶层是要兑换的面额,然后根据不同硬币数值进行兑换后得到第二层,例如当前硬币数值为[1,2,5],面额为9,那么分别兑换硬币1,2,5后所得数额分别为8,7,4,接下来分别针对第二层3个节点进行相应操作...注意我们这里要使用广度优先搜索,也就是我们按照层次来遍历节点,首先处理第一层,然后处理第二层,以此类推,当遇到第一个值为0的节点时,我们就找到了硬币数最少的兑换方案,例如在上面例子中,第三层出现了0节点...我们看一个具体实例,假设要兑换的面额有6,那么对应的方案有: 1,1,1,1,1,1 1,1,1,1,2 1,5 2,2,2 从实例上看,所有方案的集合有一些特点:某一些方案的集合包含了硬币1,某些方案的集合不包含...最左边的节点及其之后的子节点都可以分出3个分支,第二层中间节点在延伸出子节点时,它只考虑硬币[2,5]产生的分支,第二层最后一个节点在延伸出子节点时只考虑硬币5产生的分支,如此来看解决硬币兑换问题,其实使用

    49820

    挑战程序竞赛系列(8):2.1一往直前!贪心法(其他)

    代码思路: 先打包size为6,5,4,3 的产品,产品3比较特殊,但总共就出现四种情况,所以可以用space来记录打包3时余下的size为2的个数。...但为什么是理想状态呢?因为该问题面值是不能被撕开的,所以如果(5+1)元被发完了,只能发(5+5)和(10)元的面额了,那么自然能发的周数减小了。...第二阶段策略: 对硬币面额从大到小尽量凑得接近C,允许等于或不足C,但是不能超出C。...接着按硬币面额从小到大凑满C(凑满的意思是允许超出一个最小面值,ps此处的最小面值指的是硬币剩余量不为0的那些硬币中的最小面值),凑满之后得出了最优解,发掉,继续进入上一步骤循环。...简单证明下: 假设我们从小到大凑足C,那么必然面额小的被用掉,这就导致面额大的在填补C时,有大量的空间无法被小额填满,为了让它超过C,只能用较大额的填,而这就进一步导致面额超过C的部分大大增加,如原本

    34030

    【动态规划背包问题】站在更高的角度看待一般性的背包问题一维空间优化

    给定不同面额的硬币 coins 和一个总金额 amount。 编写一个函数来计算可以凑成总金额所需的最少的硬币个数。 如果没有任何一种硬币组合能组成总金额,返回 -1。...代表当没有任何硬币的时候,存在凑成总和为 0 的方案,方案所使用的硬币为 0;凑成其他总和的方案不存在。 由于我们要求的是「最少」硬币数量,因此我们不希望「无效值」参与转移,可设 。...对于第 个硬币我们有两种决策方案: 不使用该硬币: 使用该硬币,由于每种硬币可以被选择多次(容量允许的情况下),因此最优解应当是所有方案中的最小值。...这很合理,但是我们需要注意,如果我们在 INF 的基础上进行累加的话,常规的语言会将其变成负数最小值。 也就是在正无穷基础上进行累加,会丢失其正无穷的含义,这与数学上的正无穷概念冲突。...我们知道传统的「完全背包」二维状态转移方程是: 经过一维空间优化后的状态转移方程是(同时容量维度遍历顺序为「从小到大」): 这是我们在 学习完全背包 时推导的,是经过严格证明的,具有一般性的。

    51741

    Zerocoin: Anonymous Distributed E-Cash from Bitcoin

    为了铸造固定面额 $1 的零币,用户 Alice 首先生成一个随机的硬币序列号 ,然后使用安全的数字承诺方案对 进行承诺。...直觉上,结构的安全性源于以下事实:硬币承诺 是完全隐藏的承诺,签名证明 至少在计算上为零知识。 这两个事实确保了敌手在猜测花了哪枚硬币时的优势至多可以忽略不计。...当此事务出现在网络上时,节点检查 ,并检查 是否未出现在任何先前的事务中。...计算累加器 上面的结构实现要求验证程序在每次调用 时重新计算累加器 。 实际上,并不需要这么做。 首先,回想一下我们构造中的累加器可以增量计算,因此节点可以在到达时将新硬币添加到累加中。...处理一个 mint 交易会导致硬币被累积为 side effects。 处理 spend 交易会导致将硬币序列号添加到客户持有的支出序列号列表中。

    2.4K20

    javascript经典算法之最小硬币找零问题

    在前端的职业生涯中我们会遇到很多选择,走向不同的方向,但是唯一不变的,就是技术思维。 而算法,正是技术思维应用的结晶。...正文 笔者抽空总结了几个比较经典且实用的算法, 最少硬币找零问题 是本文介绍的第一道算法题: 问题:给出要找零的钱数amount以及可用的硬币面额c1, c2, c3, ..., 求所需的最少硬币个数。...硬币找零问题也可以用该思想来解决,首先按照正常的逻辑,我们可以先计算在给定金额amount和给定面额下,一共有几种找零方法,然后求出长度最短的找零方案。...当我们使用动态规划来解决该问题时,我们可以将其分解成几个子方案,最终通过条件判断最优方案,具体实现代码如下: // 硬币找零算法 function MinCoinChange(coins) { let...其本质是一种近似解法,通过局部最优解来实现整体最优的目的,应用到我们的题目中,好比如下图所示的思路: 局部最优意味着每次我们都优先取最大的硬币面额,直到剩余金额不足最大金额时,我们会取第二大的面额,以此类推

    1.6K20

    【动态规划】心有惊雷,生似静湖 - 10. 完全背包问题

    零钱兑换 II 题目内容: 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。...如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。...同时选择的硬币不一定能够刚好等于 j . 将不等于 j 的情况 初始化为0(不能初始化为-1,否则在+=的时候会影响结果)....不知道此处为什么这样处理的可以去看我上篇文章的第一道题链接: 动态规划-9. 3....coins数组下标之间的对应关系: i – i-1, j – j-1; 2.初始化虚拟节点: 第一列中满足 j >= coins[i]的只有第一个位置,其他的不做初始化,dp[0][0] 表示的是在没有硬币的时候

    7410

    js算法初窥05(算法模式02-动态规划与贪心算法)

    无论是分治法还是动态规划或者其他什么有趣的方法,都可以使用递归这种工具来“执行”代码。   ...一、最少硬币找零问题 最少硬币找零问题是硬币找零问题的一个变种。硬币找零问题是给出要找零的钱数,以及可用的硬币面额以及对应的数量,找出有多少种找零的方法。...最少硬币找零问题则是要找出其中所需最少数量的硬币。比如我们有1,5,10,25面额的硬币,如果要找36面额的钱,要如何找零呢?答案是一个25,一个10,一个1。这就是答案。...amount) { return []; }; // cache[amount]的判断是为了在重复计算前面已经计算过的结果时可以直接返回结果...最长子序列是指,在两个字符串序列中以相同的顺序出现,但不要求一定是连续的字符串序列。

    28620

    js算法初窥05(算法模式02-动态规划与贪心算法)

    无论是分治法还是动态规划或者其他什么有趣的方法,都可以使用递归这种工具来“执行”代码。   ...一、最少硬币找零问题 最少硬币找零问题是硬币找零问题的一个变种。硬币找零问题是给出要找零的钱数,以及可用的硬币面额以及对应的数量,找出有多少种找零的方法。...最少硬币找零问题则是要找出其中所需最少数量的硬币。比如我们有1,5,10,25面额的硬币,如果要找36面额的钱,要如何找零呢?答案是一个25,一个10,一个1。这就是答案。...amount) { return []; }; // cache[amount]的判断是为了在重复计算前面已经计算过的结果时可以直接返回结果...最长子序列是指,在两个字符串序列中以相同的顺序出现,但不要求一定是连续的字符串序列。

    1.1K30

    探究贪心算法:特点与实际应用

    然而,需要注意的是,并非所有问题都适合使用贪心算法,因为贪心策略可能会导致无法获得全局最优解的情况,有时候还需要结合其他算法思想进行求解。...贪心算法在实际问题中有许多应用场景,下面是其中几个常见的例子: 找零钱问题:在给定一组面额不同的硬币和一个总金额的情况下,贪心算法可以帮助我们找到用最少的硬币组合成目标金额的方法。...算法的思路是每次选择面额最大的硬币,直到凑出目标金额为止。 活动选择问题:在一系列互相兼容的活动中,贪心算法可以帮助我们安排活动,使得参与的活动数量最多。...然而,需要注意的是,并非所有问题都适合使用贪心算法,有时候可能需要结合其他算法思想来求解。 在贪心算法的学习过程中,可能会遇到一些常见问题: Q:贪心算法一定能得到最优解吗?...在解决问题时,我们应该结合具体情况,灵活选择合适的算法来求解。

    14210

    【算法统治世界】动态规划 个人笔记总结

    通过这种方式,动态规划将问题转化为在一个DAG上寻找最优路径的问题。 动态规划如何破局? 动态规划的关键在于如何设计状态和状态转移方程,以及如何确定初始状态。...以下是动态规划的一般步骤: 使用的条件 在应用动态规划之前,我们需要确保问题满足以下条件: 最优化原理:问题能够在其子问题的基础上构造出最优解。...硬币找零问题(Coin Change Problem) 硬币找零问题是一种货币找零问题,通常描述为给定不同面额的硬币和一个总金额,求解凑成总金额所需的最少硬币个数。...例题:硬币找零 描述:给定不同面额的硬币coins和一个总金额amount,返回凑成总金额所需的最少硬币个数。 解题思路:定义dp[i]为组合成金额i所需的最少硬币个数。...状态转移方程为: dp[i] = min(dp[i], dp[i-c] + 1),对于所有c属于coins 其中,dp[i-c] + 1表示使用面额为c的硬币凑成金额i。 5.

    10200

    ACM之贪心算法

    也就是说,不 从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。...也就是说,不 从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。...为了让背包中所装物品的总价值最大,我们如何选择在背包中装哪些豆子?每种豆子又该装多少呢? ? 实际上,这个问题很简单,就是按照单价从大到小来装就行了,对吧? 以上本质上借助的就是贪心算法。...很明显,这不是最短路径,最短路径是S->B->D->T,那么这是为什么呐? 在这个问题上,贪心算法不工作的主要原因是,前面的选择,会影响后面的选择。...问题: 要求:给定面额为1,5,10,50,100,500这六种面额的硬币,各3,2,1,3,0,2枚,现在用这些硬币支付A元,求使用最少的硬币。

    75920

    用javascript分类刷leetcode3.动态规划(图文视频讲解)

    7,在用2个1,4 * 7 + 2 * 1 = 30,但是我们用5个6,5 * 6 = 30 就能用最少的硬币兑换完成方法1.动态规划思路:dp[i]表示兑换面额i所需要的最少硬币,因为硬币无限,所以可以自底向上计算...dp[i],对于dp[0~i]的每个状态,循环coins数组,寻找可以兑换的组合,用i面额减去当前硬币价值,dp[i-coin]在加上一个硬币数就是dp[i],最后取最小值就是答案,状态转移方程就是dp...if (i - coin >= 0) {//当面额大于硬币价值时 //dp[i - coin]: 当前面额i减当前硬币价值所需要的最少硬币 /...保证每次出现字符 时,前面都匹配到有效的字符方法1.动态规划图片图片思路:dp[i][j] 表示 s 的前 i 个字符能否和p的前j个字符匹配,分为四种情况,看图复杂度:时间复杂度O(mn),m,n分别是字符串...每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

    26410

    大话设计模式(三) - 适配器模式

    大话设计模式(三) - 适配器模式 定义与应用 适配器在现实场景中其实有很多, 电源的适配器, USB串口桥接到Mac Pro 上到TYPE-c 接口上,在现实生活中几乎无处不在,同样的,在计算机程序中...过多地使用适配器,会让系统非常凌乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。...因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。...renderMap(googleMap); //输出:开始渲染谷歌地图 renderMap(baiduMapAdapter); //输出:开始渲染百度地图 每日一道算法题 给定不同面额的硬币...编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

    35710

    用javascript分类刷leetcode3.动态规划(图文视频讲解)

    零钱兑换 (medium)视频讲解:传送门给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。...7,在用2个1,4 * 7 + 2 * 1 = 30,但是我们用5个6,5 * 6 = 30 就能用最少的硬币兑换完成方法1.动态规划思路:dp[i]表示兑换面额i所需要的最少硬币,因为硬币无限,所以可以自底向上计算...dp[i],对于dp[0~i]的每个状态,循环coins数组,寻找可以兑换的组合,用i面额减去当前硬币价值,dp[i-coin]在加上一个硬币数就是dp[i],最后取最小值就是答案,状态转移方程就是dp...if (i - coin >= 0) {//当面额大于硬币价值时 //dp[i - coin]: 当前面额i减当前硬币价值所需要的最少硬币 /...每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

    53220

    【地铁上的面试题】--基础部分--数据结构与算法--动态规划和贪心算法

    重叠子问题性质:动态规划问题存在重叠子问题,即不同的子问题会多次重复出现。通过记忆化或者自底向上的方式,可以避免重复计算相同的子问题,从而提高算法的效率。...在一些问题中,贪心算法可能会导致得到次优解或无法得到可行解。因此,在使用贪心算法时需要注意问题的特性和算法的适用性。有时候需要借助剪枝、回溯等技巧对贪心算法进行优化或修正,以达到更好的解决效果。...在某些问题中,贪心算法可能会导致次优解或无法得到可行解。因此,在使用贪心算法时需要仔细分析问题的特性,确保贪心选择性质和最优子结构性质成立,并在实践中进行验证。...五、贪心算法的实现和应用 5.1 零钱找零问题 零钱找零问题是一个经典的贪心算法问题,要求在给定一定面额的硬币和一个要找零的金额时,找出最少的硬币数量来组成该金额。...从面额最大的硬币开始,尽可能多地使用该硬币,直到无法再使用该面额的硬币为止。 如果无法再使用当前面额的硬币,则选择下一个面额较小的硬币,重复步骤3。

    40120

    用js分类刷leetcode3.动态规划(图文视频讲解)

    保证每次出现字符 时,前面都匹配到有效的字符方法1.动态规划外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8qCVMiV-1670395631060)(https://...零钱兑换 (medium)给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。...7,在用2个1,4 * 7 + 2 * 1 = 30,但是我们用5个6,5 * 6 = 30 就能用最少的硬币兑换完成方法1.动态规划思路:dp[i]表示兑换面额i所需要的最少硬币,因为硬币无限,所以可以自底向上计算...dp[i],对于dp[0~i]的每个状态,循环coins数组,寻找可以兑换的组合,用i面额减去当前硬币价值,dp[i-coin]在加上一个硬币数就是dp[i],最后取最小值就是答案,状态转移方程就是dp...if (i - coin >= 0) {//当面额大于硬币价值时 //dp[i - coin]: 当前面额i减当前硬币价值所需要的最少硬币 /

    80420

    用javascript分类刷leetcode3.动态规划(图文视频讲解)

    7,在用2个1,4 * 7 + 2 * 1 = 30,但是我们用5个6,5 * 6 = 30 就能用最少的硬币兑换完成方法1.动态规划思路:dp[i]表示兑换面额i所需要的最少硬币,因为硬币无限,所以可以自底向上计算...dp[i],对于dp[0~i]的每个状态,循环coins数组,寻找可以兑换的组合,用i面额减去当前硬币价值,dp[i-coin]在加上一个硬币数就是dp[i],最后取最小值就是答案,状态转移方程就是dp...if (i - coin >= 0) {//当面额大于硬币价值时 //dp[i - coin]: 当前面额i减当前硬币价值所需要的最少硬币 /...保证每次出现字符 时,前面都匹配到有效的字符方法1.动态规划图片图片思路:dp[i][j] 表示 s 的前 i 个字符能否和p的前j个字符匹配,分为四种情况,看图复杂度:时间复杂度O(mn),m,n分别是字符串...每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

    40530
    领券