思路;
1.确定dp数组的含义:dp[i]表示能凑齐价值为amount的最小硬币数目。
2.确定递推公式:金额一定时看给出的硬币面额coins[i],若给出的硬币面额一定时,则最少会有amount-coins[i]个硬币,放到数组中有dp[amount-coins[i]]个,对上面最少求值,则有:
dp[i]=min(dp[amount-coins[i]+1],dp[i])
3.确定初始化,dp数组表示最小硬币数目,对后续比较时会有影响,将dp数组初始化成最大即可
4.确定遍历范围:确定是先遍历硬币还是先遍历容器,对背包问题这题没有多大影响
5.返回求得的最小硬币数量
class Solution:
def Moneychange(self,coins:list[int],amount:int)->int:
dp=[float('inf')]*(amount+1)#将创价的呢数组初始化为负无穷大
dp[0]=0#dp[0]=0
#先遍历物品后遍历容器:
for coin in coins:
for i in range(coin,amount+1):
if dp[i-coin]!=float('inf'):#判断是否是负无穷大
dp[i]=min(dp[i-coin]+1,dp[i])#递推公式
if dp[amount]==float('inf'):#最后一种情况:背包容量(硬币总数目)小于硬币总的价格数,返回最小表示错误
return -1
return dp[amount]#返回最小的硬币数量