算法训练营Day44(动态规划之完全背包 6)

发布时间:2024年01月23日

说明

力扣上没有纯粹的完全背包的题目,所以先了解一下?完全背包的理论 ,
可以去 卡码网第52题?(opens new window)去练习完全背包
后面的两道题目,都是完全背包的应用,做做感受一下?

完全背包的理论基础

区别

对于?? 完全背包问题(装满这个背包的最大价值或者问能否装满这个背包?)? , 两层for循环可以进行颠倒,且第二层for循环需正序遍历

思考

为什么? dp[0]=1 ,还有遍历顺序

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        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]

提醒

题目求的是排列?

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        dp = [0] * (target + 1)
        dp[0] = 1
        for i in range(1, target + 1):  # 遍历背包
            for j in range(len(nums)):  # 遍历物品
                if i - nums[j] >= 0:
                    dp[i] += dp[i - nums[j]]
        return dp[target]

拓展面试题

一次可以爬1或2步,问爬完n阶楼有几种方法

再问如果一次可以爬m步,问爬完n阶楼有几种方法

写出来后问你求的是排列数还是组合数,

这个遍历顺序可不可以颠倒呢,

如果颠倒求的是什么场景,不颠倒求的是什么场景

总结

对于非完全背包问题(问装满这个背包有多少种方法),此时我们要区分求的是组合数还是排列数

①如果是组合数其遍历顺序是先遍历物品再遍历背包

②如果是排列数其遍历顺序是先遍历背包再遍历物品

文章来源:https://blog.csdn.net/2301_79788081/article/details/135759020
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。