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

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

重叠子问题:问题可以被分解为相互重叠子问题,且子问题解可以被重复使用。 有限状态数:状态数量是有限,且满足状态数*状态转移数<10^6条件,以保证算法可行性。 如何做?...例题:最大子序列和 描述:给定一个整数数组nums,返回其中最大子序列和。 解题思路:定义tempSum为当前子数组和,maxSum为当前找到最大子序列和。...硬币找零问题(Coin Change Problem) 硬币找零问题是一种货币找零问题,通常描述为给定不同面额硬币和一个总金额,求解凑成总金额所需最少硬币个数。...例题:硬币找零 描述:给定不同面额硬币coins和一个总金额amount,返回凑成总金额所需最少硬币个数。 解题思路:定义dp[i]为组合成金额i所需最少硬币个数。...例题:矩阵链乘法 描述:给定一系列矩阵维度p[1...n],其中p[i]表示第i个矩阵行数和列数,求解按照哪种顺序乘这些矩阵,使得计算成本最小

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

【愚公系列】2023年12月 五大常用算法(四)-贪心算法

Console.WriteLine("\ncoins = " + coins.PrintList() + ", amt = " + amt); Console.WriteLine("凑到 " + amt + " 所需最少硬币数量为...Console.WriteLine("\ncoins = " + coins.PrintList() + ", amt = " + amt); Console.WriteLine("凑到 " + amt + " 所需最少硬币数量为...1.4 贪心典型例题 一些贪心算法典型算法问题包括: 零钱兑换问题:给定一些不同面额硬币和一个总金额,编写一个函数来计算可以凑成总金额最少硬币数。...区间调度问题:给定一些区间,找到最多互不重叠区间数。 最小生成树问题:给定一个无向加权图,找到一棵生成树使得所有边权最小。...背包问题:给定一些物品和一个背包,物品有不同重量和价值,找到能放进背包物品使得总价值最大。 最优矩阵链乘法问题:给定一组矩阵,找到一个最优矩阵相乘顺序,使得计算乘积次数最少。

21111

LeetCode-322-零钱兑换

# LeetCode-322-零钱兑换 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...如果满足上述约束条件,计算硬币数量总和并返回所有子集中最小值 for循环每一个硬币,选择0个1面值硬币,判断当前选择情况*面值是否小于等于总面值S,进入下层递归选择硬币应该固定1面值,选择2面值,idxCoin...,定义 F(S):组成金额S所需最少硬币数量 [c0,......方法3、动态规划-自下而上: 采用自下而上方式进行思考,仍定义F(i)为组成金额i所需最少硬币数量,假设在计算F(i)之前,我们已经计算出F(0)-F(i-1)答案,则F(i)对应转移方程为...其中cj代表是第j枚硬币面值,即我们枚举最后一枚硬币面额是cj,那么需要从i-cj这个金额状态F(i-cj)转移过来,再算上枚举这个硬币数量1贡献,由于要硬币数量最少,所以F(i)为:前面能转移过来状态最小值加上枚举硬币数量

52420

LeetCode 训练场:322. 零钱兑换

描述 给定不同面额硬币 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; // 内层循环循环求所有选择最小

19630

算法奥秘:常见六种算法(算法导论笔记2)

首先确定查找范围最左端和最右端,然后根据目标元素中间元素比较结果来确定下一步查找方向,不断缩小查找范围直至找到目标元素或确定目标元素不存在为止。...具体来说,我们首先将查找范围设为整个数组,然后通过比较目标元素中间元素大小,不断将查找范围缩小,直到找到目标元素或确定目标元素不存在为止。...Prim算法:用于求解最小生成树问题,在一个无向加权图中找到一棵包含所有节点且权值和最小树。 Kruskal算法:用于求解最小生成树问题,通过不断添加边来构建最小生成树,直至所有节点都被覆盖。...背包问题:给定一组物品,每种物品都有自己重量和价值,背包总容量有限。求解如何选择物品放入背包使得背包内总价值最大。 最大子段和问题:给定一个整数数组,求解连续子数组使得其和最大。...这种策略虽然不一定能找到最优解(即使用最少数量钱币),但通常能找到一个接近最优解结果。 贪心算法优点在于它每一步操作都非常简单明了,也容易实现。

21010

LeetCode-322-零钱兑换

# LeetCode-322-零钱兑换 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...如果满足上述约束条件,计算硬币数量总和并返回所有子集中最小值 for循环每一个硬币,选择0个1面值硬币,判断当前选择情况*面值是否小于等于总面值S,进入下层递归选择硬币应该固定1面值,选择2面值,idxCoin...,定义 F(S):组成金额S所需最少硬币数量 [c0,......方法3、动态规划-自下而上: 采用自下而上方式进行思考,仍定义F(i)为组成金额i所需最少硬币数量,假设在计算F(i)之前,我们已经计算出F(0)-F(i-1)答案,则F(i)对应转移方程为...其中cj代表是第j枚硬币面值,即我们枚举最后一枚硬币面额是cj,那么需要从i-cj这个金额状态F(i-cj)转移过来,再算上枚举这个硬币数量1贡献,由于要硬币数量最少,所以F(i)为:前面能转移过来状态最小值加上枚举硬币数量

49010

浅析常见算法范式

动态规划案例:最小硬币找零问题 这是一个名为为硬币找零问题常见面试题。硬币找零问题是给定找零金额,找出可以用多少特定数量硬币来找零方式。...最小硬币找零问题只是找到使用给定面额所需最少硬币数量。例如,如果需要找零 3 毛 7 分,则可以使用 1 个 2 分,1个 5 分,1 个 1 毛钱和1个 2 毛钱。...,并试图找到一个全局最佳方案。...动态规划不同,它不考虑全局。贪心算法倾向于简单直观,但可能不是整体最优解决方案。 贪心算法案例:最小硬币找零问题 上面用动态规划解决硬币问题也可以用贪心算法解决。...如果它不起作用,就回溯并重复步骤 1,直到找到合适解决方案为止。

90221

力扣每日一刷(2023.9.14)

377 组合总和Ⅱ 题目 给你一个由 不同 整数组成数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 元素组合个数。...互不相同 1 <= target <= 1000 进阶:如果给定数组中含有负数会发生什么?...计算并返回可以凑成总金额所需 最少硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币数量是无限。..., 而本题是返回可以凑成总金额所需最少硬币个数 所以这两道题在递推公式上略有不同。...注意: 因为要获取最少硬币个数 ,所以在初始化dp数组时候需要将其赋予最大值, 这样才能再每次递推时候获取最小值(也就是最少使用硬币个数) 对于dp[0]初始化,这里给dp[0] = 0,按照题意总金额为

9210

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

零钱兑换 题目链接:https://leetcode-cn.com/problems/coin-change/ 给定不同面额硬币 coins 和一个总金额 amount。...编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币数量是无限。...递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); dp数组如何初始化 首先凑足总金额为0所需钱币个数一定是0,那么dp[0] = 0; 其他下标对应数值呢...能把遍历顺序讲明白文章几乎找不到! 这也是大多数同学学习动态规划苦恼所在,有的时候递推公式很简单,难在遍历顺序上!...组合总和 Ⅳ中求是排列数。 而本题是要求最少硬币数量硬币是组合数还是排列数都无所谓!所以两个for循环先后顺序怎样都可以!

47110

力扣322——零钱兑换

原题 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...原题url:https://leetcode-cn.com/problems/coin-change/ 解题 求出所有可能 我们可以从小到大,求出由当前硬币,组成所有金额最小数,这样最终就是最大金额所能组成最小硬币数量...coinChange(int[] coins, int amount) { // 排序,升序 Arrays.sort(coins); // 用来记录中间结果,各种金额所需硬币数量...(补充一点,如果使用 bfs 的话,可以借助队列来实现非递归形式。) 所谓优化,就是从硬币使用上来说,从面值大开始,并且从可以使用数量最大开始。...与此同时,我们也记录了最小使用数量,如果用当前面值最大硬币并且使用最多时,依旧大于最小值,那么就不用继续查找了。

38310

leetcode 322. 零钱兑换

for (int i = 0; i < amount+1; ++i) dp[i] = amount + 1; //凑出总价值为0,所需硬币数为0---这是最小子问题,我们可以直接得出...//选择当前硬币后存在两种可能: //1.刚好凑出来所需硬币数---i-coin==0---dp[i-coin]==dp[0]==0 //2.拿了当前硬币后,还是没凑满所需硬币数量...所需最少硬币数没有算出来, //但是注意我们最外层循环已经说了,是从最小1开始往上直到amount,一层层求出每个所需最少硬币数 //既然i-coin比i小,并且dp[i-coin...]==amount+1等于最大值初始值,说明现有的硬币种类根本无法凑出i-coin值 //既然求不出i-coin所需最少硬币数,自然也无法求出当前i所需最少硬币数 if (i...,是会随着发现不同硬币而做出不同选择而发生改变 //可能选择后硬币数会更少,也可能会更多 dp[i] = min(dp[i], dp[i - coin] + 1); } }

35510

LeetCode题组:第322题-零钱兑换

1.题目 难度:中 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。...5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明:你可以认为每种硬币数量是无限..., amount = 11 凑成面值为 11 最小硬币数可以由以下 3 者最小值得到: 1、凑成面值为 10 最小硬币数 + 面值为 1这一枚硬币; 2、凑成面值为 9 最小硬币数 +...面值为 2 这一枚硬币; 3、凑成面值为 6 最小硬币数 + 面值为 5 这一枚硬币; 即:dp[11] = min (dp[10] + 1, dp[9] + 1, dp[6] + 1)。...]=0; for(i=0;i<=amount;i++)//状态转移方程 { int number=amount+1; //逐个比较i-coins[j]所需最小硬币

63320

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

("不超过背包容量最大物品价值为 " + res); } } 5.2 零钱兑换问题 给定 (n) 种硬币,第 (i) 种硬币面值为 (coinsi - 1) ,目标金额为 (amt) ,每种硬币可以重复选取...amt = 4; // 动态规划 int res = coinChangeDP(coins, amt); Console.WriteLine("凑到目标金额所需最少硬币数量为...("凑到目标金额所需最少硬币数量为 " + res); } } 5.3 零钱兑换问题 II 给定 (n) 种硬币,第 (i) 种硬币面值为 (coinsi - 1) ,目标金额为 (amt)...,每种硬币可以重复选取,问在凑出目标金额硬币组合数量。...("凑出目标金额硬币组合数量为 " + res); } } 6.编辑距离问题 编辑距离问题是指将一个字符串转化为另一个字符串所需最少编辑操作数。

23143

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

题目描述 简言之就是找到最少完全平方数来相加得到给定目标数字。...1、解决思路 不难看出,这道题目的状态转移方程为:nums[n] = Math.min(nums[n],nums[n - i* i] + 1),我们可以使用迭代方法,不断迭代调用之前每一个数字平方数之和最小个数...题目描述 简言之,使用最少硬币数量,兑换成给定金额。 1、解决思路 我们对比一下上面的完全平方数题目,会惊奇发现,其实两者在本质上是完全一样呀!哈哈!...我们可以将小于给定目标完全平方数,当做这道题目的硬币面额集合,经过这样转换,我们是不是就完全一样啦! 当然,我们还是可以换一种算法实现方式!...算法差别: 在上面的完全平方中,由于我们不知道所有的完全平方集合,所以我们需要每次去尝试小于当前target下面的所有完全平方数。

26720

一文了解最大似然估计

在这里,观察到正面数量 是一个随机变量,它会随着 不同取值而改变。...似然函数输入是模型参数取值,输出是在给定参数下观测数据出现可能性。 概率质量函数和似然函数区别在于它们关注对象不同。...如果将参数想象成旋钮,那么这实际上就是找到最适合数据旋钮设置。 我们可以将我们目标表达如下: 公式中,argmax操作返回产生目标函数最大值参数。...更一般地说,它是一个模型函数,描述了在给定特定参数设置情况下数据分布方式。 2.2 给似然函数加上对数 现在,让我们将这些想法上面描述硬币抛掷数据联系起来。...上面的方程说明是,如果我们成功找到了最大化目标函数参数,那么对数似然导数应该为零。 我们将对数似然导数设置为零,就可以解出未知参数。 让我们试试对我们硬币抛掷数据这么做。

54710

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

给定不同面额硬币 coins 和一个总金额 amount。 编写一个函数来计算可以凑成总金额所需最少硬币个数。 如果没有任何一种硬币组合能组成总金额,返回 -1。...你可以认为每种硬币数量是无限。...本题每种硬币可以被选择「无限次」,我们可以直接套用「完全背包」状态定义进行微调: 定义 为考虑前 件物品,凑成总和为 所需最少硬币数量。...当「状态定义」「基本初始化」有了之后,我们不失一般性考虑 该如何转移。...对于第 个硬币我们有两种决策方案: 不使用该硬币: 使用该硬币,由于每种硬币可以被选择多次(容量允许情况下),因此最优解应当是所有方案中最小值。

48441

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

霍夫曼编码(Huffman Coding): 在数据压缩中,使用贪心算法构建最优二进制前缀树,以实现对不同字符高效编码。...请设计一个算法实现:使用最少数量硬币凑出目标金额。贪心算法思路:排序: 首先,按硬币面值降序排列硬币,以确保每次选择使用面值最大硬币。...,返回硬币数量,否则返回-1表示无法凑出目标金额 return amount == 0 ?...然后,减去已经使用硬币面值金额,继续进行下一轮迭代,直到目标金额为0或者无法继续凑出目标金额。最终,算法选择硬币数量是 {25, 25, 10, 1, 1, 1},凑出了目标金额 63。...目标是选择最大数量互相兼容活动,如何确保它们不重叠。活动编号开始时间结束时间A114A235A306A457A589A659贪心算法思路:排序: 首先,按照活动结束时间进行升序排序。

46311

硬币找零问题

硬币找零问题是一种经典背包问题。 顾名思义,就是你去商店买完东西,售货员会给你用若干枚硬币找钱,如何使用这些硬币完成找零。...问题一:组成当前值所需最少硬币数目 给定不同面额硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需最少硬币个数。...将不同面额硬币抽象为成不同物品,面额为物品重量,amount为最大容量,每个物品价值均为一,如此该问题就可以转化为求解恰好装满背包能获得最低价值问题。...定义dp[i] [j] 为当前可以使用下标为0~i - 1硬币,组成金额 j 最小硬币数目。...-1 : dp[amount]; } } 上述为空间压缩之后代码。 问题二:凑成当前值组合数目 给定不同面额硬币和一个总金额。写出函数来计算可以凑成总金额硬币组合数。

1.4K20

GREEDY ALGORITHMS

贪心选择性质是指每一步局部最优选择最终能够导致全局最优解。最优子结构性质是指问题最优解包含子问题最优解。 贪心算法基本思想如下: 首先定义问题优化目标,明确要求找到最大值或最小值。...硬币兑换问题(Coin changing) 给定货币面额:1、5、10、25、100,设计一种使用最少数量硬币向客户支付金额方法 收银员算法(Cashier’s algorithm) 在每次迭代中,...证明: 定义:令 d 等于算法分配教室数量。 步骤 1:教室 d 是开放,因为我们需要安排一次讲座,比如讲座 j,前 d - 1 个教室中所有讲座都不兼容。...目标找到一个作业执行顺序,使得所有作业最大延迟 L = maxᵢ ℓᵢ 最小化。 这个问题属于NP-hard问题,通常使用贪心算法或动态规划等近似算法来求解。...目标:我们目标找到最佳缓存替换策略,使得在数据请求序列中发生缓存未命中次数最少,从而尽量减少替换带来代价。

31020
领券