【发布时间】:2016-01-24 21:41:14
【问题描述】:
我对动态编程的经验很少。我用它解决了一个 DNA 比对问题、一个基本的背包问题和一个简单的寻路问题。我理解他们是如何工作的,但这并不是我觉得绝对舒服的事情。
我有一个问题让我想起了 0-1 动态规划,但这些差异让我感到厌烦,我不确定我是否仍然可以使用这种技术,或者我是否必须满足于递归方法。
假设我有一个项目列表,每个项目都有不同的价值、重量和成本。每个项目可能不止一个。
假设我必须从那些最有价值的物品中选择一个组合,但要保持在重量和成本的限制范围内。到目前为止,我已经描述了几乎有两个约束的背包问题。但这里有区别:
所选项目的价值会根据我在组合中的数量而变化。
假设每个项目都有一个与之关联的功能,它告诉我一组这些项目对我来说价值多少。它是一个基本的线性函数,例如 value_of_item = -3(该项目的数量)+ 50
所以,如果我在一个组合中有 1 件,那么它对我的价值是 47。如果我有 2 个,那么它们对我来说每个只值 44。
如果我为此使用动态编程表,那么对于每个单元格,我都必须回溯以查看该项目是否已经在当前组合中,从而使 DP 毫无意义。但也许有办法重新构建问题,以便我可以利用 DP。
希望这是有道理的。
另一种方法是在成本和重量的限制内生成每个物品组合,计算每个组合的价值,选择最有价值的组合。即使是 1000 个项目的列表,这将是一个昂贵的搜索,而且我会反复计算。我想找到一种方法来利用 DP 的优势。
【问题讨论】:
-
DP 的本质是执行计算,然后允许快速查找该结果以供将来计算。这需要在表示输入条件的某个唯一数字与该组条件的计算成本之间进行映射。如果我有 2Red 和 3Green 以及 4Blue,我可以将所有可能的组合唯一编号为:r=#of red, g=#of green, b=#of blue, id = r*(3*4) + g*4 + 乙。我可以使用 id 来查找缓存的计算。
标签: c recursion combinations dynamic-programming