代码随想录算法训练营第四十四天| ● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

文章讲述了如何使用动态规划解决完全背包问题,如518题零钱兑换II和377题组合总和IV,强调了遍历顺序对结果的影响——先遍历物品后遍历背包得到组合数,反之得到排列数。此外,还提出了一个拓展问题:爬楼梯的不同方式,这个问题同样可以通过动态规划求解排列数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完全背包

518. 零钱兑换 II 

这道题只能先遍历物品,再遍历背包  纯的完全背包问题两个for循环可以变换顺序,这里不可以

for(i=0;i<coins.size;i++)  物品

   for(j=coins[i];j<=amount;j++) 背包{

} 这样得到的是组合数

for(j=0;j<=amount;j++)  背包

    for(i=0;i<coins.size;i++) 物品{

} 这样得到的是排列数

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        #dp[j]:装满容量为j的背包,有dp[j]种方法
        dp=[0]*(amount+1)
        dp[0]=1
        for i in range(len(coins)):
            for j in range(coins[i],amount+1):
                dp[j]+=dp[j-coins[i]]
        return dp[amount]

377. 组合总和 Ⅳ 

先物品再背包,得到的是组合数;先背包再物品,得到的是排列数

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        #dp[j]:装满容量为j的背包,有dp[j]种组合方法
        dp=[0]*(target+1)
        dp[0]=1
        for j in range(target+1):
            for i in range(len(nums)):
                if j>=nums[i]:
                    dp[j]+=dp[j-nums[i]]
        return dp[target]

拓展题:

爬楼梯爬n阶,一步可以爬1,2,...,m步台阶,求爬到楼顶有多少种方法

答:求排列数,先背包再物品

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值