动态编程 - 书柜的最大排列

时间:2016-03-15 21:49:44

标签: algorithm dynamic-programming

我正在尝试解决问题,因此我不是在寻找代码,而是针对类似的算法,所以我可以自己解决。

我获得n个书柜,每个书柜里面有size本书。我将这些书柜中的一些移到新房间,如下所示:

  • 第一个书柜将永远被移动;
  • 我将保留新书房的订单(我无法更改新房间的位置,一旦我选择了书架6,我就无法从{{1}中选择任何一本书}});
  • 书架0 to 5不能放在任何一个书架ii-1旁边(例如:我不能放置?-4-5 - ?/? - 5-6 ? - / - 4-5-6 - );?

哪种书柜配置能为我提供最多的书籍?

我知道这是使用动态编程算法解决的,但我不确定是哪一个。我最初认为它类似于背包问题,但我没有限制书籍所以它显然是不同的(至少我认为是这样)。

非常感谢任何建议!

1 个答案:

答案 0 :(得分:1)

制作数组int M[n],然后设置M[0] = b[0],因为第一个书架总是被移动。然后按以下步骤操作:

  • 对于每个元素b[i]i > 0,设置M[i] = b[i]
  • Mj之间的索引0处回顾i-2的元素,包括在内;从i-2开始,因为您无法使用b[i]
  • 之前的书架
  • M[i]设置为当前M[i]M[j] + b[i]的最大值。这个表达的含义是“我带b[i]并将其附加到以j结尾的一系列书柜
  • 循环结束后,浏览M[],找到最高元素。这是你的答案。
  • 要打印书架索引序列,请从M[]的最大元素位置开始(例如p)并打印p
  • 现在回顾M,查看k < p位置,M[k] = M[p] - b[p]。由于数组M[]的构造方式,至少会有一个这样的元素。
  • 打印k,设置p=k,然后继续,直至到达阵列的开头。