有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.
问最多能装入背包的总价值是多大?
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
"""
def backPackII(self, m, A, V):
# write your code here
n = len(A)
dp = [0 for _ in range(m+1)]
for i in range(n):
for j in range(len(dp)-1, A[i]-1, -1):
dp[j] = max(dp[j], dp[j-A[i]] + V[i])
return dp[-1]
基础的背包问题,最重要的就是递推式:在这个二维dp数组(可优化为1维)中,每行代表前n个的最佳组合,在空间为m时的最大价值。选或者不选,都考虑,即可枚举出所有情况。
dp的难点也在于这种大胆的假设,假设前n个最佳组合,是一个大胆的选择。
最神奇的点在于,你不需要显式的记录哪个装了哪个没装,以及已经装了哪几个元素等信息。
细节可见下面的dp表。