1

我正在自学基本的编程原理,但我陷入了一个动态编程问题。让我们以臭名昭著的背包问题为例:

给定一组项目,每个项目都有一个权重和一个值,确定要包含在集合中的每个项目的计数,以便总权重小于或等于给定限制并且总值尽可能大。

让我们将重量限制设置为 10,并给出两个列表:weights = [2,4,7] 和 values = [8,4,9](我只是编造了这些)。我可以编写代码以在给定约束的情况下给出最大值——这不是问题。但是,如果我想知道我最终使用了哪些值呢?不是总价值——个别价值。所以对于这个例子,最大值将是权重为 2 和 7 的对象,总值为 8 + 9 = 17。我不希望我的答案读为“17”——我想要一个列表的输出比如:(8, 9)。这个问题可能很容易,但我正在处理的问题使用更大且具有重复数字的列表(例如,多个对象的值为 8)。

让我知道是否有人能想到任何事情。一如既往,对社区充满爱和感激。

4

2 回答 2

2

将每个部分解决方案视为一个节点。只需将您使用的任何内容添加到每个节点中,最后成为答案的任何节点都将包含您使用的项目集。

因此,每次找到新解决方案时,您只需将项目列表设置为新的最佳解决方案的项目列表并为每个项目重复。

于 2011-10-01T06:07:30.327 回答
1

一个基本的数组实现可以帮助您跟踪哪些项目启用了新的 DP 状态以获取它的值。例如,如果您的 DP 数组是,w[]那么您可以拥有另一个数组p[]。每次为 生成状态时w[i],您将设置p[i]为您用来获取“w[i]”的项目。然后输出用于的项目列表w[n],输出p[n],然后移动到索引n-weightOf(p[n]),直到达到 0 以输出所有项目。

于 2013-02-09T01:27:33.667 回答