我现在正在研究 Leetcode 322. Coin Change,问题如下:
给你一个整数数组coins,表示不同面额的硬币,一个整数表示总金额。
返回您需要的最少数量的硬币来弥补该金额。如果该金额不能由任何硬币组合弥补,则返回-1。
您可以假设您拥有无限数量的每种硬币。
示例 1:
输入:coins = [1,2,5], amount = 11 输出:3 解释:11 = 5 + 5 + 1
示例 2:
输入:硬币 = [2],金额 = 3 输出:-1
示例 3:
输入:硬币 = [1],金额 = 0 输出:0
示例 4:
输入:硬币 = [1],金额 = 1 输出:1
示例 5:
输入:硬币 = [1],金额 = 2 输出:2
我试图通过带有记忆的自上而下的 DP 来解决它。我在辅助函数中设置了一个参数来记住计数。
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
c = set(coins)
dp = [0] * (amount + 1)
def helper(a, count):
if a == 0:
return count
# if a in c:
# return 1 + count
if dp[a] != 0:
return dp[a]
res = math.inf
for coin in c:
if a - coin >= 0 and helper(a-coin, count+1) != -1:
res = min(res, helper(a-coin, count+1))
dp[a] = res if res < math.inf else -1
return dp[a]
return helper(amount, 0)
但它不会通过这种情况:
[1,2,5] 100
结果应该是 20,但我得到了 92。
我整个下午都试图弄清楚,但不知道我哪里做错了。我希望你能给我一些建议,我哪里出错了。
在此先感谢您的帮助。