您是否需要为动态编程背包排序输入

时间:2015-04-24 17:14:12

标签: dynamic-programming knapsack-problem

在每个例子中,我发现使用动态编程的1/0背包问题,其中项目具有权重(成本)和利润,它从未明确表示对项目列表进行排序,但在所有示例中它们都已排序通过增加重量和利润(更高的权重在示例中具有更高的利润)。所以我的问题是当从项目数组/列表中添加矩阵中的项目时,我可以按任何顺序添加它们,还是添加权重或利润最小的项目?因为从多个例子中我发现我不确定它只是巧合,或者你确实需要每次都将最小的重量/利润放入矩阵

4 个答案:

答案 0 :(得分:3)

动态编程解决方案只不过是以有效的方式选择所有可能性(蛮力)(只需保存它们)...注意我们考虑所有子集...... 现在,如果列表是否排序,子集的总数将是相同的,并且子集将是相同的,并且最后将考虑所有子集。所以即使列表是任何顺序,或多或少,这无所谓......

答案 1 :(得分:0)

也许您正在寻找自下而上的动态解决方案。当您使用自下而上的方法解决时,动态解决方案中有一个特征。

“第二种方法是自下而上的方法。这种方法通常取决于 关于子问题的“大小”的一些自然概念,以解决任何特定的问题 子问题仅取决于解决“较小”的子问题。我们排序 按尺寸分的子问题,按尺寸顺序求解,最小。当解决一个 特别是子问题,我们已经解决了所有较小的子问题 解决方案取决于,我们已经保存了他们的解决方案我们解决每个子问题 只有一次,当我们第一次看到它时,我们已经解决了所有问题 先决条件子问题。“

从, 算法简介,CORMEN(第3版)

答案 2 :(得分:0)

不,您不需要对权重进行排序,因为每一行都会在该行的权重限制下给出最大可能值。最大值将出现在该行的最后一列中。

答案 3 :(得分:0)

在这种情况下,“较小的问题”在可供选择的可用项目数量方面较小,而与这些项目的利润或权重无关。如果给定一个3项列表,则子问题将是2项,并且有1个项可供选择。

最小的问题首先被硬编码(基本情况),然后在从较小的问题转变为较大的问题的每个阶段,都列举了最大的利润,并选择了最大的问题。最后,将考虑所有2 ^ n个组合,重复max的各个阶段将冒出最大的解。

更改输入订单或将占主导地位的项目放入输入中(例如较高的权重和较低的利润)可能只会更改max()在每个阶段赢得的参数,但最终的max结果将来自相同的项目选择,尽管在算法的不同阶段选择了不同的排序顺序或输入特征。