我正在尝试解决此问题,我想知道是否存在已知的算法/解决方案来解决此问题。
问题:
我有n个袋子和n个物品(相等或不同的重量)可装入这些袋子。这些袋子中的每个袋子都有一定的重量限制,因此需要将n个物品放入这些袋子中,这样我才能在每个袋子中使用最大的空间。
袋子大小相等。也将想知道如何解决尺寸不等的袋子。
我读过的大多数解决方案都在尝试解决具有重量和价值的0/1背包。我应该认为重量和价值相同吗?我在正确的轨道上吗?
这不是作业问题。
这被称为垃圾箱包装问题(NP难题)。
通过简单地按其大小对降序进行排序,然后将每个项目插入列表中具有足够剩余空间的第一个垃圾箱中,就可以得到11/9 OPT + 6/9垃圾箱(其中OPT是最佳解决方案中使用的垃圾箱数)。这很容易实现O(n²),或者可能O(n log n)具有有效的实现。
11/9 OPT + 6/9
OPT
O(n²)
O(n log n)
就最佳解决方案而言,没有一个背包问题众所周知的动态编程解决方案。该资源有一个选项-基本思想是:
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)
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)
O(minimumBagsUsed.2maxItemsPerBag)
在1袋的情况下,这本质上是子集和问题。为此,您可以将重量与值视为相同,并使用背包算法求解,但是对于多个袋子来说,这实际上并不是很好。
为什么不?考虑5,5,5,9,9,9袋子大小为的物品16。如果只解决子集和,则剩下的只有5,5,5一个袋子,9每个袋子一个(总共4袋子),而不是5,9三个袋子。
5,5,5,9,9,9
16
5,5,5
9
4
5,9
子集总和/背包的问题已经很棘手-如果使用它不能为您提供最佳解决方案,那么您也可以使用上面的排序/贪婪方法。