【问题标题】:how to solve arrange boxes to get the smallest height problem and which algorithm to use?如何解决排列框以获得最小高度问题以及使用哪种算法?
【发布时间】:2020-11-04 06:46:58
【问题描述】:

如何解决这个问题? 给定一组盒子,要求将这些盒子放在彼此的顶部,以达到可能的最小高度。 除非 X 的 2D 底面积小于或等于 Y 的 2D 底面积,否则不能将框“X”放在另一个框“Y”的顶部。允许旋转任何框以使用任意两个边作为它的基础。它必须只使用每个盒子的一个实例

【问题讨论】:

  • 面积还是尺寸?如果是区域,则旋转每个框以使最短的一端向上并按区域排序。如果是尺寸,你会如何处理 (4,4,4)(5,3,1)(6,2,2) 的框?
  • @btilly 我没明白你所说的面积或尺寸是什么意思?无论如何,在您的测试用例中,我们将有这些框和旋转(4,4,4),第二个框(5,3,1)(5,1,3)(3,1,5),第三个框(6 ,2,2) (2,2,6) 所以最优解是 7 => (4,4,4) 然后 (5,3,1) 然后 (6,2,2)
  • 我认为@btilly 的意思是,这是一个书面的微不足道的问题,但如果有一个限制,如果一个盒子只能放在另一个盒子的顶部,那么它的表面就更难了包含在下面框的表面中。在示例中,将 5x3 表面置于 4x4 表面之上,违反了这一点。
  • @Dave,非常感谢!如果我们有 box1 (9,3,6), box2 (2,3,7), box3 (6 ,4,10),答案是 box3,底数为 6*10,高度为 4,然后是 box1,底数为 6*9,高度为 3,然后是 box2,底数为 3*7,高度为 2 .. 让我感到困惑的是问题的陈述他写了“区域”,我第一次想到它类似于 box stacking 著名的 DP 问题

标签: algorithm dynamic-programming


【解决方案1】:

在线性时间内找到每个盒子的最小长度边,以及其他两条边形成的面积。在 O(n log n) 中按这些区域排序。

这不是 DP 问题。

【讨论】:

  • 如果排序后,由于面积限制,所有的盒子都不能相互堆叠怎么办?
  • @another_CS_guy 在我们按表面积排序后,我们将所有框放在一个列表中,其中每个表面积 >= 下一个,根据需要。
  • @another_CS_guy 我们也有每个盒子的最小尺寸作为高度,所以最小可能的高度。
【解决方案2】:

我不认为我们可以使用 DP 解决这个问题。我建议采用回溯方法。

  1. 找到每个盒子所有可能的旋转,维护这些可能的旋转数组

  2. 根据基区对数组进行排序

  3. 逐个处理每个框,检查是否可以将其添加到已添加的框之上。

  4. 当所有盒子都被添加到堆栈时,检查它是否有最小高度。

  5. 回溯以不同的方式处理这些框。

另外,我们需要有一个集合来确保每个盒子只添加一个实例(在添加盒子之前,检查是否在此迭代中添加了盒子)。

链接到您在 cmets 中提到的着名回溯问题: https://www.geeksforgeeks.org/box-stacking-problem-dp-22/

【讨论】:

  • 链接问题更难。在这里,我们关心区域并允许平等。他们在那里分别关心尺寸,不允许平等。
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 2010-10-10
  • 1970-01-01
  • 2016-10-26
  • 2018-02-08
  • 1970-01-01
  • 2015-05-30
  • 2023-01-08
相关资源
最近更新 更多