0-1背包问题
首先我们需要构建dp二维数组并明确他的含义.
dp[i][j]:从下标为[0-i]的物品中任意取,放进容量为j的背包中获得的物品最大价值。
使用滚动数组使dp降维
使用一维的dp数组同样需要明确他的物理意义;在这道题里,dp[j]的意义是,容量为j的背包能装的商品的最大价值。
for(int i = 0; i < weight.size(); i++) { // 遍历物品
for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
}
}
416.分割等和子集
本题中dp[j]的物理意义:容量为j的背包,所背商品的最大价值是dp[j]
class Solution:
def canPartition(self, nums: List[int]) -> bool:
# dp[j]:容量为j的背包,所装商品的最大价值是dp[j]
if sum(nums)%2 != 0:
return False
target=sum(nums)//2
dp=[0]*(target+1) #初始化
for num in nums:
for j in range(target,num-1,-1):
dp[j]=max(dp[j],dp[j-num]+num)
return dp[-1]==target