解决与背包问题相关的问题的最佳方法是什么,该问题具有3个变量,例如:值,重量和体积? (最大可能值,最大重量和最大体积)
我曾尝试使用基于其值/(权重*体积)的已定义索引,但我认为这不会为我提供最佳解决方案,因此我进行了搜索,有人建议使用动态编程,但所有主题均与之相关为此,只有2个变量(值和权重),我不知道超过2个变量会如何影响这一点。
答案 0 :(得分:3)
您应该能够使用一个约束扩展标准动态编程问题,以处理两个或更多约束。
作为复习,针对背包问题的标准DP解决方案通过按顺序订购商品,然后回答以下形式的所有问题来工作:
在不超过w的情况下,使用前i个物品可以产生的最大值是多少?
这将变成一个2D表,其中一个轴表示要考虑的项目数,另一个轴表示可能的重量值。要填充表格,您可以将i = 0的一维条目切片设置为零(如果没有任何项目,则无法获得任何值),然后考虑i = 1来填充一维切片是否包括或排除第一个项目,通过考虑是否包括或排除第二个项目,在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)的工作来填充每个表项。
您看到了如何使它适应大量约束吗?
答案 1 :(得分:0)
假设您将值,重量和体积作为参数,并且要使用动态编程计算在不超出初始可用重量和体积限制的情况下可以拥有的最大值。动态编程基于递归公式。因此,这里我只告诉您递归公式,实现起来并不难。
我用 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是起始索引。
ComputeAnswer(0,V,W)