目录
完全背包
问题描述:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。
和01背包的求解区别:1. 遍历背包从倒序变为正序;2. 在纯完全背包问题中,物品和背包的两次遍历可以颠倒
def test_complete_pack1():
weight = [1, 3, 4]
value = [15, 20, 30]
bag_weight = 4
dp = [0]*(bag_weight + 1)
for i in range(len(weight)):
for j in range(weight[i], bag_weight + 1):
dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
print(dp[bag_weight])
518. 零钱兑换 II
完全背包求组合
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]] #装满大小为j的背包有多少种方式
return dp[amount]
377. 组合总和 Ⅳ
完全背包求排列:这时候就需要先遍历背包再遍历物品
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0] * (target+1)
dp[0] = 1
for j in range(1, target+1):
for i in nums:
if j >= i:
dp[j] += dp[j-i]
return dp[-1]