📜  选择给定重量和价值比的最大重量(1)

📅  最后修改于: 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表示物品数量,wv是长度为n的数组,分别表示每个物品的重量和价值,W表示背包的容量。返回值是所选物品的最大总价值。

时间复杂度

该算法的时间复杂度是$O(nW)$,其中$n$是物品数量,$W$是背包的容量。因此,对于一些较大的问题,该算法可能会超时,需要进行优化。