leetcode 322:零钱兑换

这篇博客介绍了如何解决LeetCode上的322题,即零钱兑换问题。当给定不同面额的硬币和一个总金额时,需要找出凑成总金额所需的最少硬币数。文章首先尝试使用贪心算法,但发现这种方法并不适用于所有情况,随后转向动态规划的解决方案。动态规划的状态定义为dp[i],表示凑出金额i所需的最小硬币数量。状态转移方程为dp[i] = min(dp[i], dp[i-coins[i]] + 1),并初始化dp[0] = 0,其他dp[i] = amount + 1。最后,通过检查dp[amount]是否改变来判断是否返回-1,表示没有硬币组合能组成总金额。" 121234438,8488508,Python等级考试详解:数字类型与字符串操作,"['Python', '开发语言', '后端']
摘要由CSDN通过智能技术生成

leetcode 322:零钱兑换


无限背包问题
有N种物品和一个容量为V的背包,每种物品都有无限件可用,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。

无限背包(完全背包)特点:物品种类为n个(每种物品数量无限)

题目描述:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1

解题步骤

方法一:贪心算法。看到这类题目第一想法就是采用贪心算法来求解。但是贪心算法也存在不足之处:
如果我们换一组钞票面值,比如 1, 5, 11,我们要凑出15的时候, 贪心策略就会出错:
15 = 11 * 1 + 1 * 4 (贪心策略)
15 = 5 * 3(正确策略)

方法二:动态规划

由于贪心算法无法适用于所有面额的情况,我们采用动态规划的方法来求解
1、 状态定义:dp[i]表示凑出金额i所需要的最小硬币数量
2、 状态转移方程:dp[i] = min(dp[i],dp[i-coins[i]]+1) (i >= conins[i])
Conins[i]表示最后一枚硬币的面值数,将该硬币添加进去后,总金额数减少,并且硬币数量增加<

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值