我对这项任务有很大的疑问:
你有一个n(n <= 1000)个方框。他们每个人都有一些力量和重量。盒子的强度是盒子的最大重量,你可以放在这个盒子上。你可以用这个盒子制作最大高度的桩?
换句话说,如果我有一个方框(x1,y1),(x2,y2),..,(xk,yk),其中x_i是方框的强度,我可以建立一个桩,当且仅当:
x2&gt; = y1
x3&gt; = y1 + y2
...
xk&gt; = y1 + y2 + ... + y_(k-1)
你有什么想法解决它吗?我听说我们必须找到这个盒子的一些分类,这样如果我们可以用盒子(a1,a2,... ak)做一堆,那么总是a1&lt; a2&lt; ......&lt; AK。我明白了,如果我们将这个方块排序,我们可以通过简单的动态编程找到答案。但正如我所说,我不知道它是怎么回事:\提前谢谢。
答案 0 :(得分:2)
这是一个改编自A *方法的想法。但是,我们不是找到最小长度路径,而是想找到最大高度堆。
让我们从一些理论分析开始。考虑一下,我们已经有一堆力量s1
,我们在其上放置了另一个重量为w2
和力量s2
的方框。最终桩的强度为min(s1 - w2, s2)
。
我们从空堆状态(height, strength, boxes) = (0, infinity, empty)
开始。此外,对于任何桩状态,我们需要一个上限,我们可以在那堆上放多少箱子。计算此界限的一种方法是使用桩的强度和最小箱重(不在该桩上的箱子)的商。为了有效地计算这种启发式,最初可以根据它们的重量对方框进行排序。
其余的是A *算法的简单应用。从可用集中的所有状态中,选择具有最高预期桩(=高度+启发式)的状态。如果此桩高于您当前的最高桩,请保存此状态。计算尚未在堆上的每个框的结果桩状态,并从可用集中移除当前状态。然后迭代。
如果可用集合中的桩状态没有预期的桩高高于当前最高桩,则找到最高桩。
这种方法可以让你忽略那些显然无法在很早的时候对最高桩做出贡献的桩状态。由于桩状态只能从恰好一个其他堆状态到达,因此您不需要处理打开和关闭列表中的状态。
答案 1 :(得分:0)
因为最低的盒子必须支撑最大的重量,所以你需要最强的盒子作为最低的盒子。使用相同的推理,你需要顶部的wekaest框。
所以用“强度”作为排序键对你的盒子进行排序,把最强的盒子放在底部,最弱的位置在顶部。
现在每个方框计算它在当前位置支持的重量。
如果某个方框的重量超出其支持的重量,请移除此方框上方的最重框。
重复直到堆中剩下的所有方框都没问题。
修改强>
此解决方案不正确(请参阅注释) 我把它留在这里作为参考。