我正在尝试解决这个问题,我想知道是否有已知的现有算法/解决方案来解决这个问题。
问题:
我有n个袋子和n个物品(相同或不同的重量)填入这个袋子。这些袋子中的每一个都有一定的重量限制,并且需要将n个物品放入这些袋子中,以便我可以使用每个袋子中的最大空间。
袋子大小相同。还想知道如何解决不同尺寸的袋子。
我读过的大部分解决方案都试图解决一个重量和价值都在0/1的背包。我应该考虑重量和价值吗?我是在正确的轨道上吗?
这不是一个家庭作业问题。
答案 0 :(得分:10)
这被称为the bin packing problem(NP-hard)。
通过简单地按递减顺序对递减顺序进行排序,然后将每个项目插入列表中第一个具有足够剩余空间的bin中,我们得到11/9 OPT + 6/9
个bin(其中OPT
是bin的数量用于最佳解决方案)。这样可以轻松地将O(n²)
或O(n log n)
与高效实施相结合。
就最佳解决方案而言,没有一种动态编程解决方案与背包问题一样众所周知。 This resource有一个选项 - 基本理念是:
D[{set}] = the minimum number of bags using each of the items in {set} Then: D[{set1}] = the minimum of all D[{set1} - {set2}] where set2 fits into 1 bag and is a subset of set1
上面的数组索引实际上是一个集合 - 将其视为设置为值的映射,位图或多维数组,其中每个索引为1或0以指示是否包含与该维度对应的项目或不。
链接资源实际上考虑了多种类型,可以多次出现 - 我从中得出了上述解决方案。
运行时间在很大程度上取决于可装入行李的物品数量 - 它将是
O(minimumBagsUsed.2maxItemsPerBag)
。
对于1个包,这基本上是the subset sum problem。为此,您可以将重量与值相同并使用背包算法进行求解,但这对于多个行李箱来说效果不会很好。
为什么不呢?考虑包大小为5,5,5,9,9,9
的商品16
。如果您只是解决子集总和,则您只需将5,5,5
放在一个包中,9
放在一个包中(总共4
个包),而不是5,9
每袋3个。
子集和/背包已经是一个难题 - 如果使用它不会给你一个最佳解决方案,你也可以使用上面的排序/贪婪方法。