通过动态规划方法,dp[amount]为金钱为amount时需要的最少硬币数目,状态转移公式,当最后一枚硬币是ci的时候,d[amount]=dp[amount-ci]+1,最后这枚硬币是多少需要遍历。
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp=[float('inf') for _ in range(amount+1)]
dp[0]=0
for i in range(amount+1):
for j in range(len(coins)):
if i>=coins[j]:
dp[i]=min(dp[i-coins[j]]+1,dp[i])
if dp[amount]==float('inf'):return -1
return dp[amount]通过记忆化递归,节省时间。
![]()
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
minvalue=float('inf')
memo={}#注意使用字典
#@functools.lru_cache(amount)
def dfs(amount):
if amount==0:
return 0
if amount<0:
return -1
mini=float('inf')
for i in range(len(coins)):
if (amount-coins[i]) in memo:
res= memo[amount-coins[i]]
else:
res=dfs(amount-coins[i])
memo[amount-coins[i]]=res
print(res)
if res>=0 and mini>res:#注意这个地方一层一层递归回来,所以会出现大于0的情况。
mini=res+1
return mini if mini<float('inf') else -1
return dfs(amount)

京公网安备 11010502036488号