125. 背包问题 II

Posted yunxintryyoubest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了125. 背包问题 II相关的知识,希望对你有一定的参考价值。

125. 背包问题 II

中文English

有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.

问最多能装入背包的总价值是多大?

样例

样例 1:

输入: m = 10, A = [2, 3, 5, 7], V = [1, 5, 2, 4]
输出: 9
解释: 装入 A[1] 和 A[3] 可以得到最大价值, V[1] + V[3] = 9 

样例 2:

输入: m = 10, A = [2, 3, 8], V = [2, 5, 8]
输出: 10
解释: 装入 A[0] 和 A[2] 可以得到最大价值, V[0] + V[2] = 10

挑战

O(nm) 空间复杂度可以通过, 不过你可以尝试 O(m) 空间复杂度吗?

注意事项

  1. A[i], V[i], n, m 均为整数
  2. 你不能将物品进行切分
  3. 你所挑选的要装入背包的物品的总大小不能超过 m
  4. 每个物品只能取一次
输入测试数据 (每行一个参数)如何理解测试数据?

10
[2,3,5,7]
[1,5,2,4]

class Solution:
    ‘‘‘
    大致思路:
    1. 转移方程
    dp[i][j] = dp[i - 1][j]
    dp[i][j] = max(dp[i][j], dp[i - 1][j - A[i - 1] + V[i - 1]]
    ‘‘‘
    def backPackII(self,m,A,V):
        #初始条件
        max_value = 0
        l = len(A)
        dp = [[0]*(m + 1) for _  in range(l + 1)]

        #对于前0个物品,拼出m重量,是不可能的,价值也是0 

        #对于i个物品,拼接0重量,存在,价值为0

        #计算顺序
        for i in range(1, l + 1):
            for j in range(1, m + 1):
                #当前前i个物品,要达到重量j的话,上一次已经达到了重量j,所以价值一样
                dp[i][j] = dp[i - 1][j]

                if (j - A[i - 1]) >= 0:
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - A[i - 1]] + V[i - 1])
                    #dp[1][2] = max(dp[0][2], dp[0][2 - 2] + V[0]) >> 1
                    #dp[1][3] = max(dp[0][3], dp[0][3 - 2] + V[0]) >> 1

                    #dp[2][3] = max(dp[2][3], dp[1][3 - 3] + V[1]) >> 5
                    #dp[2][4] = max(dp[2][4], dp[1][4 - 3] + V[1]) >> 5
                    #dp[2][4] = max(dp[2][4], dp[1][5 - 3] + V[1]) >> 6

        return dp[l][m]

 

以上是关于125. 背包问题 II的主要内容,如果未能解决你的问题,请参考以下文章

LintCode 125 · 背包问题---01背包问题

动态规划第六篇:01背包问题(分割等和子集 + 最后一块石头的重量 II)

动态规划第六篇:01背包问题(分割等和子集 + 最后一块石头的重量 II)

[M背包] lc518. 零钱兑换 II(完全背包+背包求方案数)

PCL异常处理:pcl 1.8.13rdpartyoostincludeoost-1_64oost ypeofmsvc ypeof_impl.hpp(125): error(代码片段

AcWing 5. 多重背包问题 II