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

C++ 不知算法系列之深入动态规划算法思想

:"<< db[i]<<endl; } return 0; } 输出结果: 2.2 找零钱 2.2.1 问题描述 给你k种面值硬币,面值分别为c1, c2 ... ck,每种硬币数量无限,再给一个总金额...amount,问最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1 。...比如说k = 3,面值分别为 1,2,5,总金额amount = 11。那么最少需要 3 枚硬币凑出,即 11 = 5 + 5 + 1。...原理很简单,对于 11 分钱零钱而言,可以先拿出一枚 1分硬币,也可以先拿出一枚5分硬币,或者是拿出一枚 10分硬币,然后再计算剩下钱需要找回多少硬币。...总结 如果问题都可以使用动态规划实现,则问题字面描述可能形形色色,但问题内在一定会具有相似性。如找零钱问题就可以转化成背包问题。

42310

动态规划: 给我个机会,我再兑换一次零钱

零钱兑换 题目链接:https://leetcode-cn.com/problems/coin-change/ 给定不同面额硬币 coins 和一个总金额 amount。...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币数量是无限。...dp[j] 要取所有 dp[j - coins[i]] + 1 中最小。...代码如下: vector dp(amount + 1, INT_MAX); dp[0] = 0; 确定遍历顺序 本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币最小个数。。...本题钱币数量可以无限使用,那么是完全背包。所以遍历内循环是正序 综上所述,遍历顺序为:coins(物品)放在外循环,target(背包)在内循环。且内循环正序。

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

局部最优解算法-贪心算法详解

以下是一些贪心算法常见应用场景:找零钱问题: 例如硬币找零问题,选择最大面值硬币直到凑够总金额。...霍夫曼编码(Huffman Coding): 在数据压缩中,使用贪心算法构建最优二进制前缀树,以实现对不同字符高效编码。...请设计一个算法实现使用最少数量硬币凑出目标金额。贪心算法思路:排序: 首先,按硬币面值降序排列硬币,以确保每次选择使用面值最大硬币。...贪心选择: 从硬币面值数组中选择面值最大硬币,尽可能多地使用这个硬币,直到凑够或超过目标金额。更新剩余金额: 在每一步中,更新剩余金额,即目标金额减去已经使用硬币价值。..."无法凑出目标金额"); } }在这个例子中,贪心算法思路体现在从硬币面值数组中选择面值最大硬币,尽可能多地使用这个硬币直到凑够目标金额

40011

零钱兑换

零钱兑换 2. 描述 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明: 你可以认为每种硬币数量是无限...实现方法 3.1 方法 1 3.1.1 思路 确定 base case,目标金额为 0,返回 0; 确定【状态】,即原问题和子问题中会变化变量。...毫无疑问,此时【状态】为目标金额 amount; 确定【选择】,导致【状态】产生变化行为。设么会导致目标金额发生变化?答案是硬币,没选择一枚硬币,就会导致目标金额减少。...<= amount; i++){ // 数组初始值也为 amount + 1 dp[i] = amount + 1; // 内层循环循环求所有选择最小

18230

每日手撕一道算法题-322.零钱兑换

每日手撕一道算法题-322.零钱兑换 322. 零钱兑换 题目: 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...如果没有任何一种硬币组合能组成总金额,返回 -1。...凑11最少硬币数 = 凑10最少硬币数/凑9最少硬币数/凑6最少硬币数 中最少那个 凑10最少 = 凑9最少 / 凑8最少 / 凑5最少 最少那个 依次循环 转成正向思路是,开辟长度...直接使用剩余值结果 + 1即可。然后去 这些最少那个。就是凑2最优解。 后面的依次这样。 直到11号索引结束。如果11号索引不是我们一开始赋初值,则说明有答案,返回答案。...成了最小值返回回去了。

65840

【动态规划背包问题】强化「换元一维优化」技巧

给定不同面额硬币和一个总金额。 写出函数来计算可以凑成总金额硬币组合数。 假设每一种面额硬币有无限个。...示例 2: 输入: amount = 3, coins = [2] 输出: 0 解释: 只用面额2硬币不能凑成总金额3。...零钱兑换 中,我们求是「取得特定价值所需要最小物品个数」。 对于本题,我们求是「取得特定价值方案数量」。 求东西不一样,但问题本质没有发生改变,同样属于「组合优化」问题。...对于第 个硬币我们有两种决策方案: 不使用硬币使用硬币:由于每个硬币可以被选择多次(容量允许情况下),因此方案数量应当是选择「任意个」该硬币方案总和: 代码: class Solution...零钱兑换」 和 本篇「518. 零钱兑换 II」本质是一样。 之所将两题分开成两篇【练习】,主要是为了加强大家对于「一维优化」熟练度。

1.1K62

八十九、动态规划系列背包问题之完全背包

示例 2: 输入: n = 13 输出: 2 解释: 13 = 4 + 9 首先,明确dp,然后找dp转移方程。 这里,dp[i]:表示完全平方数和为i 最小个数。...给定不同面额硬币 coins 和一个总金额 amount。...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...# 第一步:定义dp数组或变量,首先明确题目说每种硬币数量是无限,但是会给定一个固定 amount 金额,我们需要用最少硬币数凑出这个金额,如果是01背包问题就是[0]开始; #...return -1 return dp[-1] 「至此完全背包就到这里结束了,完全背包注意dp定义,求最大还是最小,完全背包关键词就次数是无限」 - END

26830

贪心算法

引例 [找零钱] 一个小孩买了价值少于1美元糖,并将1美元钱交给售货员。售货员希望用数目最少硬币找给小孩。假设提供了数目不限面值为2 5美分、1 0美分、5美分、及1美分硬币。...售货员分步骤组成要找零钱数,每次加入一个硬币。选择硬币时所采用贪婪准则如下:每一次选择应使零钱数尽量增大。...为保证解法可行性(即:所给零钱等于要找零钱数),所选择硬币不应使零钱总数超过最终所需数目 引例分析 为使找回零钱硬币最小,不考虑找零钱所有各种方案,而是从最大面值币种开始,按递减顺序考虑各币种...,先尽量用大面值币种,只当不足大面值币种金额才会去考虑下一种较小面值币种。...例如,在付款问题中,已付出货币构成解集合。 (3)解决函数solution:检查解集合S是否构成问题完整解。例如,在付款问题中,解决函数是已付出货币金额恰好等于应付款。

1.5K20

【动态规划算法练习】day16

零钱兑换 1.题目简介 322. 零钱兑换 给你一个整数数组 coins ,表示不同面额硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需 最少硬币个数 。...如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币数量是无限。...j所需要硬币数 dp[0] = 0;//总金额为0的话,所需硬币数为0 for(int i = 0;i < coins.size(); ++i) {...零钱兑换 II 1.题目简介 518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额硬币组合数。...如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额硬币有无限个。 题目数据保证结果符合 32 位带符号整数。

14230

动态规划详解(修订版)

一般使用一个数组充当这个「备忘录」,当然你也可以使用哈希表(字典),思想都是一样。...二、凑零钱问题 先看下题目:给你k种面值硬币,面值分别为c1, c2 ... ck,每种硬币数量无限,再给一个总金额amount,问你最少需要几枚硬币凑出这个金额,如果不可能凑出,算法返回 -1 。...然后确定dp函数定义:函数 dp(n)表示,当前目标金额是n,至少需要dp(n)个硬币凑出该金额。 然后确定「选择」并择优,也就是对于每个状态,可以做出什么选择改变当前状态。...3、dp 数组迭代解法 当然,我们也可以自底向上使用 dp table 来消除重叠子问题,dp数组定义和刚才dp函数类似,定义也是一样: dp[i] = x表示,当目标金额为i时,至少需要x枚硬币...列出动态转移方程,就是在解决“如何穷举”问题。之所以说它难,一是因为很多穷举需要递归实现,二是因为有的问题本身解空间复杂,不那么容易穷举完整。

50350

【愚公系列】2023年12月 五大常用算法(三)-动态规划算法

由于动态规划不包含回溯过程,因此只需使用循环迭代实现,无须使用递归。在以下代码中,我们初始化一个数组 dp 来存储子问题解,它起到了记忆化搜索中数组 mem 相同记录作用。...("不超过背包容量最大物品价值为 " + res); } } 5.2 零钱兑换问题 给定 (n) 种硬币,第 (i) 种硬币面值为 (coinsi - 1) ,目标金额为 (amt) ,每种硬币可以重复选取...,问能够凑出目标金额最少硬币个数。...("凑到目标金额所需最少硬币数量为 " + res); } } 5.3 零钱兑换问题 II 给定 (n) 种硬币,第 (i) 种硬币面值为 (coinsi - 1) ,目标金额为 (amt)...,每种硬币可以重复选取,问在凑出目标金额硬币组合数量。

20843

LeetCode-322-零钱兑换

# LeetCode-322-零钱兑换 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...,定义 F(S):组成金额S所需最少硬币数量 [c0,......假设我们知道F(S),即组成金额S最少硬币数,最后一枚硬币面值是C。...其中cj代表是第j枚硬币面值,即我们枚举最后一枚硬币面额是cj,那么需要从i-cj这个金额状态F(i-cj)转移过来,再算上枚举这个硬币数量1贡献,由于要硬币数量最少,所以F(i)为:前面能转移过来状态最小值加上枚举硬币数量...当i<0时,忽略F(i) F(i) 最小硬币数量 F(0) 0 //金额为0不能由硬币组成 F(1) 1 //F(1)=min(F(1-1),F(1-2),F(1-5))+1=1 F(2) 1 //F(

49620

本周小结!(动态规划系列五)

周三 动态规划:322.零钱兑换给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数(每种硬币数量是无限)。...本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币最小个数。。 所以本题并不强调集合是组合还是排列。...你需要让组成和完全平方数个数最少(平方数可以重复使用)。 如果按顺序把前面的文章都看了,这道题目就是简单题了。dp[i]定义,递推公式,初始化,遍历顺序,都是和动态规划:322....我这里做一下总结: 求组合数:动态规划:518.零钱兑换II 求排列数:动态规划:377. 组合总和 Ⅳ、动态规划:70. 爬楼梯进阶版(完全背包) 求最小数:动态规划:322....零钱兑换、动态规划:279.完全平方数 此时我们就已经把完全背包遍历顺序研究透透了!

60920

刷题第10篇:从完全平方到零钱兑换

1、解决思路 不难看出,这道题目的状态转移方程为:nums[n] = Math.min(nums[n],nums[n - i* i] + 1),我们可以使用迭代方法,不断迭代调用之前每一个数字平方数之和最小个数...=0,则代表已经被初始化了,就可以按照上面的迭代方式取最小值了。...T322--零钱兑换【中等题】 题目描述 ?...题目描述 简言之,使用最少硬币数量,兑换成给定金额。 1、解决思路 我们对比一下上面的完全平方数题目,会惊奇发现,其实两者在本质上是完全一样呀!哈哈!...我们可以将小于给定目标数完全平方数,当做这道题目的硬币面额集合,经过这样转换,我们是不是就完全一样啦! 当然,我们还是可以换一种算法实现方式

25720

LeetCode-322-零钱兑换

# LeetCode-322-零钱兑换 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...,定义 F(S):组成金额S所需最少硬币数量 [c0,......假设我们知道F(S),即组成金额S最少硬币数,最后一枚硬币面值是C。...其中cj代表是第j枚硬币面值,即我们枚举最后一枚硬币面额是cj,那么需要从i-cj这个金额状态F(i-cj)转移过来,再算上枚举这个硬币数量1贡献,由于要硬币数量最少,所以F(i)为:前面能转移过来状态最小值加上枚举硬币数量...当i<0时,忽略F(i) F(i) 最小硬币数量 F(0) 0 //金额为0不能由硬币组成 F(1) 1 //F(1)=min(F(1-1),F(1-2),F(1-5))+1=1 F(2) 1 //F(

46910

​LeetCode刷题实战322:零钱兑换

今天和大家聊问题叫做 零钱兑换,我们先来看题面: https://leetcode-cn.com/problems/coin-change/ You are given an integer array...给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币数量是无限。...,首先一个ans数组,存储当前index钱应该用几个coins,主要思路就是,要么是当前index中存储需要硬币个数,要么是当前index值amount需要当前ans[index]中存储硬币个数...,然后加上当前这一枚硬币,就是amount为index时所需硬币个数,取这两种可能中最小值就是所需最少硬币个数。...最后ans[amount]中存储就是兑换amount所需硬币个数。

26140
领券