文章目录
- 1.题目描述
- 2.解题思路
- 3.代码实现
1.题目描述
题目链接:零钱兑换
2.解题思路
1.确定二维dp[i][j]的含义:
dp[i][j] 前i个物品任取,装入容量为j的背包种,最少的硬币个数是dp[i][j]
2.确定递推公式:
dp[i][j] = min(dp[i-1][j], dp[i][j-coins[i]]+1)
dp[i-1][j]
含义:不放入第i个元素的最少硬币硬币个数为dp[i-1][j]
dp[i][j-coins[i]]+1
: 放入第i个元素的最少硬币个数为dp[i][j-coins[i]]+1
(因为你放入了第i个硬币,所以你的硬币个数要+1
)
3.代码实现
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
# dp[i][j] 前i个元素任取,凑满容量为j的背包的最少硬币个数为dp[i][j] 最后求的是dp[len(coins)-1][amount]
# 递推公式 dp[i][j] = min(dp[i-1][j], dp[i][j-coins[i]]+1)
#1.定义dp
dp = []
for i in range(len(coins)):
tmp = [float('inf')] * (amount+1)
dp.append(tmp)
#2.初始化行和列
#2.1第一行概念:物品0装满容量为J的背包,需要的硬币个数为?
#2.2第一列概念:物品i装入背包容量为0,需要的硬币个数为? 0
for i in range(len(coins)):
dp[i][0] = 0
for j in range(coins[0], amount+1):
if j % coins[0] == 0:
dp[0][j] = (j // coins[0])
# 3.遍历
for i in range(1,len(coins)):
for j in range(1, amount+1):
if j - coins[i] < 0:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = min(dp[i-1][j], dp[i][j-coins[i]]+1)
if dp[-1][-1] != float('inf'):
return dp[-1][-1]
return -1
这里其他位置初始化无穷大,表示暂时没有方法凑成dp[i][j]