LeetCode百题【零钱兑换】
题目描述
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 2^31 - 1
0 <= amount <= 10^4
解法
动态规划
- 定义
dp[i]
为组成金额 i 所需最少的硬币数量 - 动态转移方程为
- 即我们枚举最后一枚硬币面额是coin,那么需要从dp[i-coin]这个金额的状态转移过来,再算上枚举的这枚硬币数量1的贡献
- 由于要硬币数量最少,所以dp[i]为前面能转移过来的状态的最小值加上枚举的硬币数量1 。
- 定义
1 |
|
- 时间复杂度:O(Sn)
来源:力扣(LeetCode)
链接:322. 零钱兑换 - 力扣(LeetCode)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 漫漫长夜!