最后更新于
最后更新于
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
示例 2:
说明:
你可以认为每种硬币的数量是无限的。
与很相似, 只是由于1
可能不存在, 因最终可能没有答案. 按照每次考虑添加一个硬币, 从0逐渐推算到总金额. 考虑状态dp[i][v]
表示使用前i
种硬币, 构成总金额为v
的最少硬币数量. 我们使用inf
代表没有组合方案, 以方便比较最小值, 简化状态转移方程, 在最后输出答案的时候, 按题目要求转换成-1即可.
滚动数组优化空间复杂度的版本.
或者这样考虑, 对于总金额v
, 遍历所有硬币情况, 去掉这个硬币, 取其中的最小值. 当去掉某个硬币后总金额小于0, 说明方案不可行, 使用inf
表示.
使用动态规划的思路, 其实是自下而上, 即从0逐渐推算到最后的总金额n
. 我们也可以转化成自上而下的思路, 这就是DFS的思路. 再使用LRU缓存中间结果, 防止重复计算.