对象堆叠,动态编程

时间:2016-12-28 11:57:53

标签: algorithm dynamic-programming

我正在处理类似于可以使用动态编程算法解决的盒子堆叠问题的问题。我在这里阅读有关它的帖子,但我很难理解DP方法,并希望对其工作方式进行一些解释。这是手头的问题:

  

给定X个对象,每个对象都有自己的权重'w'和强度's',如何   很多人可以叠加在一起吗?一个对象可以携带自己的   重量和它上面所有重量的总和,只要它没有   超过它的力量。

我知道它有一个最佳的子结构,但它的重叠子问题部分让我感到困惑。我正在尝试创建一个递归树,以查看它将多次计算相同的内容,但我无法弄清楚该函数是否会采用一个或两个参数。

2 个答案:

答案 0 :(得分:2)

解决此问题的第一步是证明您可以找到一个最佳堆栈,其中包含从最高到最低强度排序的框。

然后你只需按强度对盒子进行排序,找出哪些盒子包含在最佳堆栈中。

递归子问题有两个参数:找到可以放在堆栈顶部的最佳堆栈,其中X保持强度,使用列表中位置> = Y的框。

答案 1 :(得分:1)

如果存在良好的DP解决方案,则需要2个参数:

  • 访问对象的数量或未访问对象的数量
  • 您当前可以承受的未访问对象的总重量(访问对象的重量无关紧要)

为了使它工作,你必须找到排序,将对象放在下一个对象之上是没用的。也就是说,对于违反此排序的任何解决方案,还有另一种解决方案遵循此排序并且更好或相等。

您必须证明存在选定的顺序并清楚地定义它。我不认为Matt Timmermans建议的按力量进行简单分类就足够了,因为重量有一定意义。但它是证明部分......