📅  最后修改于: 2023-12-03 14:58:01.103000             🧑  作者: Mango
这个问题被称为0/1背包问题,是一个经典的动态规划问题。
简而言之,我们有若干个物品,每个物品有一定的重量和价值。我们需要从这些物品中选择一些物品放进一个容量为W的背包中,使得所选物品的总重量不超过W,同时总价值最大。
最常见的解决方法是用动态规划。我们用dp[i][j]
表示前i
个物品总重量不超过j
的最大总价值。则对于第i
个物品,有两种选择:
j
的最大总价值为dp[i-1][j]
。j
的最大总价值为dp[i-1][j-w[i]]+v[i]
,其中w[i]
和v[i]
分别是第i
个物品的重量和价值。综上可得递推式为:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
def knapsack(n, w, v, W):
dp = [[0] * (W+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(1, W+1):
if j < w[i]:
dp[i][j] = dp[i-1][j]
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]]+v[i])
return dp[n][W]
其中,n
表示物品数量,w
和v
是长度为n
的数组,分别表示每个物品的重量和价值,W
表示背包的容量。返回值是所选物品的最大总价值。
该算法的时间复杂度是$O(nW)$,其中$n$是物品数量,$W$是背包的容量。因此,对于一些较大的问题,该算法可能会超时,需要进行优化。