将石块分配到桶中(不是微不足道)/整数箱填料上限

时间:2013-12-29 09:18:52

标签: algorithm combinatorics bin-packing buckets upperbound

假设你有k石和m石类型 你有第一种类型的f1石头,第二种类型的f2,依此类推。

(即sum(f_i)= k)。

此外,我们给出一个正整数r。

所需的最小桶数是多少,这样我们就可以将石头类型分配到桶中,每个桶的大小不超过r? (我们也知道每一个,f_i< = r)。

这个问题实际上是某种垃圾箱包装,所以我不确定它有一个确切的答案,但我们可以给它一个上限吗?

一个简单的上限的例子是m,因为这将允许我们打包每种石头类型 他自己的桶。

不起作用的界限的示例是k / r。 原因是如果k = 9,r = 3并且我们有5种石头类型,f1 = 2,f2 = 2,f3 = 2,f4 = 2,f5 = 1,

然后,无论我们如何划分石头类型,都必须有一个尺寸为> = 4的桶。

来自同一类型的所有宝石必须转到同一个桶中。

有任何建议:)?

编辑:m和f_i是未知的,我正在寻找一个能让我为所有(m,f_i)组合分发宝石的界限。

另一个例子: 假设r = 3。 我将证明k / 2桶足够了:

让我们用x表示有3个宝石的类型数。 y将表示正好有2个宝石的类型数量,z表示单石类型的数量。

根据定义: 3x + 2y + z = k。 我们可以为3石头类型分配x桶。

如果(y> z){第一种情况}: 适合y类型中的一种,以及桶中的一种z类型{我们有z这样的桶}。

将其余y类型装在一个桶中。

因为y> z我们使用了正好x + y个桶,因为3x + 2y + z = k =&gt; x + y <= k / 2。

如果(z> = y){第二种情况}: 很容易看出我们可以将所有宝石放入k / 3桶中(每个桶都可以装满,包含3个宝石)。

此外,对于r = 3,这将它紧紧束缚(如果x = z = 0且y = k / 2,则我们需要恰好k / 2个桶)。

现在的问题是:对于所有r值,k / 2桶的约束是否成立?

我可以显示2k /(r + 1)个桶的下限(即一个紧密的实例),但它距离k / 2很远。谁能收紧约束?

1 个答案:

答案 0 :(得分:0)

您可以使用first-fit algorithm进行装箱问题,几乎不需要进行任何修改:

  1. 生成包含L个整数的列表m,每个整数代表每种类型的宝石数量。
  2. 按降序对列表进行排序。
  3. 创建新存储桶
  4. 从开始到结束运行L,如果将当前元素L添加到存储区不超过r,请添加到存储区并将其从{{{}移除1}}。
  5. 如果L为空,则返回桶数。否则回到第3步。
  6. 这个算法是L的近似值,这是相当不错的,在大多数情况下给出了非常好的结果。

    此算法的运行类型为11/9*OPT + 6/9。如果未给出O(m log m),要创建列表,您需要计算每种类型的宝石数量,这需要m时间,整个过程将花费O(L)时间。