版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击666! https://blog.csdn.net/qq_36387683/article/details/81946572
669. 换硬币
给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1
.
样例
给出 coins = [1, 2, 5]
, amount = 11
返回 3
(11 = 5 + 5 + 1)
给出 coins = [2]
, amount = 3
返回 -1
注意事项
你可以假设每种硬币均有无数个
class Solution:
"""
@param coins: a list of integer
@param amount: a total amount of money amount
@return: the fewest number of coins that you need to make up
"""
'''
def coinChange(self, coins, amount):
# write your code here
if len(coins) == 0 or amount < 0:
return -1
n = len(coins)
MAX = float('inf')
dp = [[0] * (amount+1) for _ in range(n)]
#初始化dp[0]
for i in range(1, amount+1):
dp[0][i] = MAX
if i - coins[0] >=0 and dp[0][i-coins[0]] != MAX:
dp[0][i] = dp[0][i-coins[0]] + 1
left = 0
for i in range(1, n):
for j in range(1, amount+1):
left = MAX
if j - coins[i] >= 0 and dp[i][j-coins[i]] != MAX:
left = dp[i][j - coins[i]] + 1
dp[i][j] = min(left, dp[i-1][j])
return dp[n-1][amount] if dp[n-1][amount] != MAX else -1
'''
#空间压缩方法
def coinChange(self, coins, amount):
# write your code here
if len(coins) == 0 or amount < 0:
return -1
dp = [float('inf')] * (amount + 1)
dp[0] = 0
for i in range(1, amount+1):
#遍历银币种类,大额满足条件时,会覆盖小额
for coin in coins:
if i >= coin and dp[i] > dp[i-coin] + 1:
dp[i] = dp[i-coin] + 1
return dp[-1] if dp[-1] <= amount else -1