繁体   English   中英

带有多个袋子和仅重量的物品的背包

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM