我正在尝试解决问题,因此我不是在寻找代码,而是针对类似的算法,所以我可以自己解决。
我获得n
个书柜,每个书柜里面有size
本书。我将这些书柜中的一些移到新房间,如下所示:
6
,我就无法从{{1}中选择任何一本书}}); 0 to 5
不能放在任何一个书架i
或i-1
旁边(例如:我不能放置?-4-5 - ?/? - 5-6 ? - / - 4-5-6 - );?哪种书柜配置能为我提供最多的书籍?
我知道这是使用动态编程算法解决的,但我不确定是哪一个。我最初认为它类似于背包问题,但我没有限制书籍所以它显然是不同的(至少我认为是这样)。
非常感谢任何建议!
答案 0 :(得分:1)
制作数组int M[n]
,然后设置M[0] = b[0]
,因为第一个书架总是被移动。然后按以下步骤操作:
b[i]
,i > 0
,设置M[i] = b[i]
M
到j
之间的索引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
,然后继续,直至到达阵列的开头。