📜  大重量背包(1)

📅  最后修改于: 2023-12-03 15:37:52.759000             🧑  作者: Mango

大重量背包

大重量背包(Knapsack Problem)是计算机科学领域中一个经典的组合优化问题,也是一个NP完全问题,通俗来说,就是给定n个物品和一个大小为W的背包,每个物品有一个重量和一个价值,要求选择哪些物品装入背包使得装入的物品总重量不超过背包容量,且总价值最大。

原理

大重量背包问题可以使用动态规划的思想来求解。设v[i]和w[i]分别表示第i个物品的价值和重量,c[i][j]表示:在前i个物品中能够装入容量为j的背包中的物品的最大价值,则可以列出如下递推公式:

$c[i][j]=\begin{cases} 0 & i=0 \text{ or }j=0 \ c[i-1][j] & j<w[i]\ max(c[i-1][j], c[i-1][j-w[i]]+v[i]) & j \geqslant w[i] \end{cases}$

其中,$c[i-1][j]$表示不选第i个物品时的最大价值,$c[i-1][j-w[i]]+v[i]$表示选第i个物品时的最大价值,需要比较两者大小取最大值。

代码实现
def knapSack(W, wt, val, n):
    K = [[0 for x in range(W + 1)] for x in range(n + 1)]
    for i in range(n + 1):
        for w in range(W + 1):
            if i == 0 or w == 0:
                K[i][w] = 0
            elif wt[i - 1] <= w:
                K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]],  K[i - 1][w])
            else:
                K[i][w] = K[i - 1][w]
    return K[n][W]

上述代码实现了使用动态规划求解大重量背包问题的函数,其中W表示背包容量,wt表示每个物品的重量,val表示每个物品的价值,n表示物品个数。