【问题标题】:How can I solve knapsack problems with 3 variables?如何解决具有 3 个变量的背包问题?
【发布时间】:2019-10-31 13:15:04
【问题描述】:

解决与背包问题相关的问题的最佳方法是什么?背包问题有 3 个变量,例如:价值、重量和体积? (具有最大可能值,具有最大重量和体积限制)

我尝试使用定义的索引,基于它的值/(重量*体积),但我相信这不会给我最好的解决方案,所以我搜索了一些人建议使用动态编程,但所有主题都相关对此,只有 2 个变量(值和权重),我不知道超过 2 个变量会如何影响这一点。

【问题讨论】:

    标签: algorithm optimization dynamic-programming knapsack-problem


    【解决方案1】:

    您应该能够用一个约束扩展标准动态规划问题以处理两个或多个约束。

    作为复习,背包问题的标准 DP 解决方案通过按某种顺序对物品进行排序,然后回答以下形式的所有问题:

    在不超过重量 w 的情况下,使用前 i 个物品可以产生的最大值是多少?

    这变成了一个 2D 表格,其中一个轴表示正在考虑的项目数量,另一个轴表示不同的可能重量值。要填写表格,请通过将条目设置为零来填充 i = 0 的条目的 1D 切片(如果没有项目,则无法获得任何值),然后通过考虑填充 i = 1 的 1D 切片是否包含或排除第一项,i = 2 的切片通过考虑是否包含或排除第二项等。运行时间为 O(nW),其中 n 是项目数,W 是允许的最大值重量,因为这些是表格的尺寸,每个条目都需要做 O(1) 次工作。

    如果你现在有两个约束(重量和体积),你可以解决以下形式的所有问题:

    在不超过重量 w 或体积 v 的情况下,使用前 i 个物品可以产生的最大值是多少?

    这变成了一个 3D 表格,其中一个轴表示正在考虑的物品数量,另一个轴表示不同的可能重量值,第三个轴表示可能的体积值。要填写表格,请通过将条目设置为零来填充 i = 0 的 2D 切片(如果没有项目,则无法获得任何值),然后通过考虑填充 i = 1 的 2D 切片是否包含或排除第一项,i = 2的切片通过考虑是否包含或排除第二项等。运行时间为O(nWV),其中n为项目数,W为最大允许权重,而 V 是最大允许体积(而不是值),因为这是表格条目的数量,并且需要 O(1) 的工作来填充每个条目。

    你知道如何适应更多的约束吗?

    【讨论】:

      【解决方案2】:

      假设您将价值、重量和体积作为参数,并且您希望使用动态规划计算在不超过最初可用的重量和体积限制的情况下可以拥有的最大值。动态编程基于递归公式。所以,这里我只告诉你递归公式,实现起来并不难。

      我使用 V 指代可用的初始体积,而 W 指代可用的初始重量。另外,我使用 volume[] 来指代保存卷的数组,类似地 weight[] 是权重数组。

      因此,动态规划算法所需的 3 个参数是 (1) 您当前正在检查的项目(称为 i),(2) 如何您还剩多少体积(称为 vLeft),以及 (3) 您还剩多少重量(称为 wLeft)。

      为了优化,您可以使用以下递归:

      DP[i][vLeft][wLeft] = min(DP[i + 1][vLeft - 体积[i]][wLeft - 重量[i]], DP[i + 1][vLeft][wLeft ])

      min 函数中的左边参数是我们选择项目的时间,右边的参数是我们不选择项目的时间。此外,您需要一些基本条件来判断何时没有剩余体积或重量,以及何时到达最后一项。

      但您的初始调用将是这样的,其中 0 是起始索引。

      计算答案(0, V, W)

      【讨论】:

        猜你喜欢
        • 2020-08-11
        • 1970-01-01
        • 2019-05-25
        • 2012-06-17
        • 2020-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多