leetcode-322 零钱兑换--完全背包问题

使用动态规划解决LeetCode 322题,通过完全背包模型来找到兑换指定金额所需的最少硬币数。通过状态转移方程优化,将时间复杂度降低到O(NV),实现代码并成功通过测试。
摘要由CSDN通过智能技术生成

原题地址:https://leetcode.com/problems/coin-change/

这个题目可以用dfs来写,但是很容易超时,需要剪枝。

dp中有经典的背包九讲,而此题目正好是一种完全背包的模型。

首先看完全背包模型:

有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。放入第 i 种物品 的费用是 Ci,价值是 Wi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总 和不超过背包容量,且价值总和最大。

N种物品和容量为V的背包,每种物品无限次可用。和此题目正好对应--不同面值的硬币,每种无限次可用。

完全背包问题,按照01背包的思路,可写出如下状态转移方程:

令 F[i,v] 表示前 i 种物品恰放入一个容量为 v 的背包的最大权值。仍然可以按照每种物品不同的策略写出状态转移方程:

 F[i,v] = max{F[i − 1, v − k*Ci ] + k*Wi | 0 ≤ k*Ci ≤ v}

解释一下就是,对第i种物品,可以取k件,也可以不取;遍历所有可能的k得到最大值即为F[i,v]。

对于本题,类比如下:

//j - k*c[i] >= 0 && k>0
dp[i][j] 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值