📜  骆驼和香蕉拼图 | DP(1)

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

骆驼和香蕉拼图 | DP

简介

这是一道动态规划问题,给定一个可装载重量为 $W$ 的背包和 $N$ 个物品,每个物品的重量为 $w_i$,价值为 $v_i$,问可以往背包内装入哪些物品,使得背包内的物品总价值最大。

在这道题目里可以把一头骆驼理解成一个背包,每个香蕉可以理解成一个物品,我们需要在一头骆驼能装下的最大质量限制内选择一些香蕉,使得这些香蕉的总价格最高。

算法思路

我们可以使用一个二维数组 $dp[i][j]$ 来记录对于前 $i$ 个物品,当背包容量为 $j$ 时可以装的最大价值,状态转移方程如下:

$$ dp[i][j] = \begin{cases} 0, & i = 0 \text{ 或 } j = 0 \ dp[i-1][j], & w_i > j \ \max(dp[i-1][j], dp[i-1][j-w_i]+v_i), & w_i \leqslant j \end{cases} $$

代码实现

下面给出使用 Python 实现的代码:

def knapsack(W: int, wt: List[int], val: List[int]) -> int:
    n = len(val)
    dp = [[0 for _ in range(W+1)] for _ in range(n+1)]

    for i in range(1, n+1):
        for j in range(W+1):
            if wt[i-1] > j:
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-wt[i-1]]+val[i-1])

    return dp[n][W]
总结

这道题目即使通过简单的语言将它表述成骆驼和香蕉的形象语言,核心算法思路都是完全一致的,这也是动态规划的魅力所在。在日常工作中,我们或许也可以通过富有想象力、形象化、直观的方式来表述一些算法或编程实例,从而增加记忆深度。