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. 每个物品只能取一次

输入测试数据 (每行一个参数)如何理解测试数据?

class Solution:
    """
    @param m: An integer m denotes the size of a backpack
    @param A: Given n items with size A[i]
    @param V: Given n items with value V[i]
    @return: The maximum value
    """
    '''
    大致思路:
    1.给出所有组合
    2.初始化p=0,判断如果sum总重量小于m,并且大于p的话,则重置p,最终返回p即可
    '''
    def backPackII(self, m, A, V):
        d = []
        res = []
        for i in range(len(A)):
            if i == 0:
                d.append([A[i]])
                res.append(V[i])
            else:
                for j in range(len(d)):
                    d.append(d[j] + [A[i]])
                    res.append(res[j] + V[i])
                d.append([A[i]])  
                res.append(V[i])   

        p = 0
        for z in range(len(d)):
            if sum(d[z]) <= m and res[z] > p:
                p = res[z]
        return p

注:lintcode未通过,你的代码内存使用超过了限制,检查你的空间复杂度。MLE通常是由多余的二维数组造成的。

 
原文地址:https://www.cnblogs.com/yunxintryyoubest/p/12831466.html