代码随想录算法训练营第38天

52 阅读1分钟

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