零钱兑换二维dp实现(力扣--动态规划)

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值