题目描述
- 零钱兑换
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
解一:动态规划
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
# 动态规划解法
# 初始化dp[]元素为正无穷,方便取最小值
dp = [float('inf')]*(amount+1)
dp[amount] = float('inf')
# 自底向上构建dp数组
# 注意base case
dp[0] = 0
for i in range(1,amount+1):
if i>= 83:
print(i)
for coin in coins:
# 如果子问题无解,跳过
if (i-coin) < 0:
continue
# 构建状态函数
dp[i] = min(dp[i], 1 + dp[i-coin]) # dp[i]初始值为无穷大
if i>= 83:
print(dp[i])
return dp[amount] if dp[amount]!= float('inf') else -1
## 解二:贪心算法+bfs