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) 空间复杂度吗?
注意事项
A[i], V[i], n, m
均为整数- 你不能将物品进行切分
- 你所挑选的要装入背包的物品的总大小不能超过
m
- 每个物品只能取一次
输入测试数据 (每行一个参数)如何理解测试数据?
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通常是由多余的二维数组造成的。