99. Leetcode 322. 零钱兑换 (动态规划-完全背包)

步骤一、确定状态:

确定dp数组及下标含义

dp数组是个amout+1的数组,dp[j]表示的是装满容量为j的背包所需要的最 少物品的个数

步骤二、推断状态方程:

对于当前物品i, 有两种选择决定了dp[j]的推导方向:
1、选择当前物品i: 那么dp[j] = dp[j-nums[i]], 因为在j-nums[i]的基础 上加上1个nums[i]就是容量j了
2、不选择当前物品i, 那么还是保留原来的最少物品个数这里面要选择最小的 dp[j] = min(dp[j], dp[j-nums[i]]+1)

步骤三、规定初始条件:

初始条件:

这个题由于是每次选最小值,所以全局初始化的时候, 初始成最大值了。 而dp[0]=0,没 有容量没法装。

步骤四、计算顺序:

对于物品, 依然是正向遍历,而对于背包,也是正向遍历,因为这里的物品 可以取多次

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        if amount == 0:
            return 0

        # dp[i]:凑成金额i的硬币所需要的最少的硬币个数
        dp = [float("inf") for _ in range(amount + 1)]
        dp[0] = 0 # 初始化

        for i in range(len(coins)): # 遍历物品
            for j in range(coins[i], amount+1): # 遍历背包容量
                dp[j] = min(dp[j], dp[j-coins[i]] + 1)

        return dp[-1] if dp[-1] != float('inf') else -1
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值