今日任务
目录
完全背包理论基础
518.零钱兑换 II - Medium
377.组合总和 Ⅳ - Medium
完全背包理论基础
理论基础:代码随想录
完全背包
有N件物品和一个最多能背重量为W的背包;第i件物品的重量是weight[i],得到的价值是value[i];每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。
完全背包和01背包问题唯一不同的地方就是,每种物品有无限件;解题过程的唯一不同之处,体现在遍历顺序上。
完全背包的物品是可以添加多次的,所以对背包大小的遍历要从小到大。
完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值。
示例代码:
def test_CompletePack():weight = [1, 3, 4]value = [15, 20, 30]bagWeight = 4dp = [0] * (bagWeight + 1)for i in range(len(weight)): # 遍历物品for j in range(weight[i], bagWeight + 1): # 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i])print(dp[bagWeight])test_CompletePack()
518.零钱兑换 II - Medium
题目链接:力扣-518. 零钱兑换 II
给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
提示:凑成总金额j的货币组合数为dp[j];遍历顺序不能变,先遍历物品再遍历背包
class Solution:def change(self, amount: int, coins: List[int]) -> int:dp = [0] * (amount+1)dp[0] = 1for coin in coins:for j in range(coin, amount+1):dp[j] += dp[j-coin]return dp[amount]
377.组合总和 Ⅳ - Medium
题目链接:力扣-377. 组合总和 Ⅳ
给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
提示:结果求排列的数量,先遍历背包再遍历物品
class Solution:def combinationSum4(self, nums: List[int], target: int) -> int:dp = [0] * (target+1)dp[0] = 1for j in range(target+1):for num in nums:if j < num:continuedp[j] += dp[j-num]return dp[target]