现有 n 个物品,第 i 个物品的体积为 vi , 重量为 wi
求当前背包最多能装多大重量的物品?
数据范围: , , ,
进阶 :
10,2,[[1,3],[10,4]]
4
第一个物品的体积为1,重量为3,第二个物品的体积为10,重量为4。只取第二个物品可以达到最优方案,取物重量为4
10,2,[[1,3],[9,8]]
11
两个物品体积之和等于背包能装的体积,所以两个物品都取是最优方案
# class Solution: def knapsack(self , V , n , vw ): # 经典问题 0/1背包 # 动态规划 dp[i][j]定义为面对前i个物品体积为j背包能装下的最大重量 dp = [[0]*(V+1) for _ in range(n+1)] # 状态转移 for i in range(1, n+1): for j in range(1, V+1): # 拿 dp[i][j] = dp[i-1][j] # 不拿 if j >= vw[i-1][0]: dp[i][j] = max(dp[i][j], dp[i-1][j-vw[i-1][0]]+vw[i-1][1]) # 计算最终能装下的最大重量 return dp[n][V]python 一维dp(空间优化)
class Solution: def knapsack(self , V , n , vw ): # 经典问题 0/1背包 # 动态规划 dp[j]定义为体积j背包能装下的最大重量 dp = [0]*(V+1) # 状态转移 for i in range(1, n+1): for j in range(V, 0, -1): # 面对第i个物品,判断能不能拿 if j >= vw[i-1][0]: dp[j] = max(dp[j], dp[j-vw[i-1][0]]+vw[i-1][1]) # 计算最终能装下的最大重量 return dp[V]
class Solution: def knapsack(self , V , n , vw ): # write code here dp = [0] * (V+1) for i in range(n): vi = vw[i][0] wi = vw[i][1] for j in range(V, vi-1, -1): if dp[j] >= dp[j-vi] + wi: continue else: dp[j] = dp[j-vi] + wi return dp[V]
class Solution: def knapsack(self , V , n , vw ): # write code here dp = [[0 for _ in range(V+1)] for _ in range(n+1)] for i in range(1, n+1): for j in range(1, V+1): if j < vw[i-1][0]: dp[i][j] = dp[i-1][j] # 当前体积不装第i个物品 else: dp[i][j] = max(dp[i-1][j], dp[i-1][j-vw[i-1][0]]+vw[i-1][1]) # # 当前体积不装第i个物品 或者 之前的体积+新装物体的价值 return dp[n][V]