1、dp函数
class Solution(object):
def coinChange(self, coins, amount):
"""
:type coins: List[int]
:type amount: int
:rtype: int
"""
if amount < 0:
return -1
if amount == 0:
return 0
max_num = 999999999
res = max_num
for coin in coins:
if self.coinChange(coins, amount - coin) == -1:
continue
res = min(res, self.coinChange(coins, amount - coin) + 1)
return -1 if res == max_num else res
2、dp函数剪枝
class Solution(object):
def coinChange(self, coins, amount):
"""
:type coins: List[int]
:type amount: int
:rtype: int
"""
memo = [float('inf')] * (amount + 1)
if amount < 0:
return -1
if amount == 0:
return 0
if memo[amount] != float('inf'):
return memo[amount]
max_num = 999999999
res = max_num
for coin in coins:
if self.coinChange(coins, amount - coin) == -1:
continue
res = min(res, self.coinChange(coins, amount - coin) + 1)
memo[amount] = -1 if res == max_num else res
return memo[amount]
3、dp数组:dp[i]表示为,当剩余金额为i时,需要的硬币个数
class Solution(object):
def coinChange(self, coins, amount):
dp = [amount + 1] * (amount + 1) # 因为amount有0,所以个数需要多一个
dp[0] = 0
for i in range(0, len(dp)):
for coin in coins:
if i - coin < 0:
continue
dp[i] = min(dp[i], 1 + dp[i - coin])
if (dp[amount] == amount + 1):
return -1
else:
return dp[amount]