LeetCode-322-零钱兑换
1. 题目:
零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1
。
示例 1:
1 | 输入: coins = [1, 2, 5], amount = 11 |
示例 2:
1 | 输入: coins = [2], amount = 3 |
说明:
你可以认为每种硬币的数量是无限的。
2. 解题:
使用动态规划,我们假设f(n)
表示n
需要的最少数量。
动态规划求最小值公式:f(n) = min{f(i) + f(n - i)}
,而对于本题,我们需要根据所给的硬币来求最小值:f(n) = 1 + f(n - coins[i])
。
为了方便计算,我们使用”自底向上”(从f(1)
到f(amount)
)和数组来存储数据,这样我们避免重复计算。
对于数组初始化,赋值为amount + 1
,我们知道假设有硬币1
,最多也只有amount
。
代码:
1 | class Solution { |