今日任务
目录
完全背包理论基础
理论基础:代码随想录
完全背包
有N件物品和一个最多能背重量为W的背包;第i件物品的重量是weight[i],得到的价值是value[i];每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。
完全背包和01背包问题唯一不同的地方就是,每种物品有无限件;解题过程的唯一不同之处,体现在遍历顺序上。
完全背包的物品是可以添加多次的,所以对背包大小的遍历要从小到大。
完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值。
示例代码:
def test_CompletePack(): weight = [1, 3, 4] value = [15, 20, 30] bagWeight = 4 dp = [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] = 1
for 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] = 1
for j in range(target+1):
for num in nums:
if j < num:
continue
dp[j] += dp[j-num]
return dp[target]