我试图解决一个问题,所以我不是在寻找代码,而是寻找类似的算法,这样我就可以自己解决它。
我有n
书架,每个书架里面都有size
本书我要把这些书架搬到一个新房间,如下所示:
第一个书架总是会被移动的;
我会保持新房间书架的顺序(我不能改变新房间的位置,一旦我选择了书架6
,我就不能从0 to 5
中选择任何一本书);
书架i
不能放在i-1
或i+1
书架旁边(例如:我不能放?-4-5-?/是吗?-5-6-?/是吗?-4-5-6-?)(二)
哪种书架的配置能给我提供最多的书?
我知道这是用动态规划算法解决的,但我不确定是哪一个。我最初以为它会类似于背包问题,但我没有书籍的限制,所以它明显不同(至少我认为是这样)。
任何建议都非常感谢!
最佳答案
创建一个数组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[]
的max元素(例如M[]
)开始,然后打印p
现在回顾一下p
的位置,这样M
。由于数组的构造方式,将至少有一个这样的元素。
打印k < p
,设置M[k] = M[p] - b[p]
,然后继续,直到到达数组的开头。