跟踪动态编程步骤

时间:2011-10-01 06:02:12

标签: python dynamic dynamic-programming knapsack-problem

我正在教自己基本的编程原理,而我却陷入了动态编程问题。让我们来看看臭名昭着的背包问题:

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

让我们将权重限制设置为10,让我们给出两个列表:权重= [2,4,7]和值= [8,4,9](我刚刚做了这些)。我可以编写代码来给出约束条件下的最大值 - 这不是问题。但是如果我想知道我最终使用的是什么价值呢?不是总价值 - 个别价值。所以对于这个例子,最大值是权重为2和7的对象,总值为8 + 9 = 17.我不希望我的答案读为“17” - 我想要一个列表的输出喜欢:(8,9)。这个问题可能很容易,但我正在处理的问题是使用更大且重复数字的列表(例如,多个对象的值为8)。

让我知道是否有人可以想到任何事情。一如既往,对社区的热爱和欣赏。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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