假设我有一些项目,它们有一个定义的length
和horizontal position
(都是常量):
1 : A
2 : B
3 : CC
4 : DDD (item 4 start at position 1, length = 3)
5 : EE
6 : F
我想将它们垂直包装,从而形成一个高度尽可能小的矩形。
到现在为止,我有一些非常简单的算法,可以循环遍历项目并逐行检查是否可以将它们放置在该行中(这意味着不会与其他东西发生冲突)。有时,它完美地工作(偶然),但有时,它会导致非最佳解决方案。
这是上面示例的内容(逐步):
A | A B | ACC B | ACC B | ACC B | ACC B |
DDD | DDD | FDDD |
EE | EE |
虽然最佳解决方案是:
ADDDB
FCCEE
注意:我发现length
在应用算法之前先按项目(降序)对项目进行排序,可以得到更好的结果(但仍然不完美)。
有没有什么算法可以在合理的时间内给我最优的解决方案?(尝试所有可能性是不可行的)
编辑:这是一个使用排序技巧不起作用的示例,并且使用 TylerOhlsen 建议的方法不起作用(除非我不明白他的答案):
1 : AA
2 : BBB
3 : CCC
4 : DD
会给:
AA BBB
CCC
DD
最佳解决方案:
DDBBB
AACCC