'''
自己的想法,超时
'''
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
# 动态规划
dp = [1 for i in range(len(coins))]
# 最简单的状态
# if amount == 0:
# return 0
# dp[amount] = num
# 对于每次减去一个金额,会使得数量发生变化
# 定义dp数组,给定一个金额amount,得到一个数量
def find(coins, amount):
if amount == 0:
return 0
min_v = float('inf')
for i in range(len(coins)):
target = amount-coins[i]
if target < 0:
continue
num = find(coins, target)+1
if num < min_v:
min_v = num
return min_v
res = find(coins, amount)
return res if res!=float('inf') else -1
# 优化,记录重复步骤
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
# 动态规划
dp = {}
def find(coins, amount):
if amount == 0:
return 0
min_v = float('inf')
for i in range(len(coins)):
target = amount-coins[i]
if target < 0:
continue
if target in dp:
num = dp[target] + 1
else:
num = find(coins, target)+1
if num < min_v:
min_v = num
if amount not in dp:
dp[amount] = min_v
return min_v
res = find(coins, amount)
return res if res!=float('inf') else -1
参考自
labuladong的算法小抄
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
# 动态规划
helper = {}
def dp(n):
if n in helper:
return helper[n]
if n == 0:
return 0
if n <= 0:
return -1
res = float('inf')
for i in coins:
target = dp(n-i)
if target == -1:
continue
res = min(res, target+1)
# if res not in helper:
helper[n] = res
return res
r = dp(amount)
return r if r!=float('inf') else -1