[英]Knapsack with multiple bags and items having only weight
我正在尝试解决此问题,我想知道是否存在已知的算法/解决方案来解决此问题。
问题:
我有n个袋子和n个物品(相等或不同的重量)可装入这些袋子。 这些袋子中的每个袋子都有一定的重量限制,因此需要将n个物品放入这些袋子中,这样我才能在每个袋子中使用最大的空间。
袋子大小相等。 也将想知道如何解决尺寸不等的袋子。
我读过的大多数解决方案都在尝试解决具有重量和价值的0/1背包。 我应该认为重量和价值相同吗? 我在正确的轨道上吗?
这不是作业问题。
这被称为垃圾箱包装问题 (NP难题)。
通过简单地按其大小对降序进行排序,然后将每个项目插入具有足够剩余空间的列表中的第一个箱中,我们得到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.2 maxItemsPerBag )
。
在1袋的情况下,这本质上是子集和问题 。 为此,您可以将重量与值视为相同,并使用背包算法求解,但是对于多个袋子来说,这实际上效果不佳。
为什么不? 考虑袋大小为16
物品5,5,5,9,9,9
。 如果仅求解子集总和,则每个袋子剩下5,5,5
,每个袋子剩下9
个(总共4
袋子),而不是3个袋子中的每个5,9
。
子集总和/背包的问题已经很棘手-如果使用它不能为您提供最佳解决方案,那么您也可以使用上面的排序/贪婪方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.