希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
欢迎关注、订阅专栏 【力扣详解】谢谢你的支持!
⭐ 题目描述:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额
最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1🔥 思路:【完全背包最值问题】采用动态规划,建立 dp 数组,利用前序 dp 数组推导其自身 dp 值
| 背包分类 | 外循环 | 内循环 |
|---|---|---|
| 0/1背包 | nums | 倒序 target,且 target>=nums[i] |
| 完全背包 | nums | 正序 target, 且 target>=nums[i] |
| 组合背包(考虑顺序) | 正序 target, 且 target>=nums[i] | nums |
| 问题分类 | dp 递推 |
|---|---|
| 最值问题 | dp[i] = max/min(dp[i], dp[i-nums]+1) 或 dp[i] = max/min(dp[i], dp[i-num]+nums); |
| 存在问题(bool) | dp[i] = dp[i] |
| 组合问题 | dp[i] += dp[i-num]; |
参考如上思路,给出详细步骤如下:
- 步骤一⭐确定 dp 数组含义:一维 dp 数组
dp[i]的含义为:凑成总金额i所需的最少的硬币个数【💥 重要】- 步骤二⭐确定 dp 推导方式:
dp[i] = min(dp[i], dp[i-c]+1)- 步骤三⭐根据 dp 数组含义,初始化 dp 数组:
- 除
dp[0](空包情况) 外,其他位置初始为INF
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
if amount == 0: return 0
INF = 100000
dp = [INF for _ in range(amount+1)] # --------------- step 1
dp[0] = 0 # ----------------------------------------- step 3
for c in coins:
for i in range(1, amount+1):
if c <= i:
dp[i] = min(dp[i-c]+1, dp[i]) # --------- step 2
return -1 if dp[-1] == INF else dp[-1] ## 记得根据题目要求确认好返回值
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦
🔥 LeetCode 热题 HOT 100