2

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

(即总和(f_i)= k)。

此外,我们得到一个正整数 r。

最少需要多少个桶,这样我们才能将石头类型分配到每个桶的大小不超过 r 的桶中?(我们也知道对于每个 i,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's) 组合分配石头。

另一个例子:假设 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 => x+y <= k/2。

if (z >= y) {第二种情况}:很容易看出我们可以把所有的石头都装在 k/3 个桶中(每个桶都可以装满,正好包含 3 块石头)。

此外,对于 r=3,这将其绑定得很紧(如果 x=z=0 和 y=k/2,那么我们正好需要 k/2 个桶)。

现在的问题是:k/2 个桶是否适用于所有 r 值?

我可以证明 2k/(r+1) 个桶的下限(即紧实例),但它与 k/2 相差甚远。任何人都可以收紧界限吗?

4

1 回答 1

0

您可以对装箱问题使用首次拟合算法,几乎不需要修改:

  1. 生成一个L包含m整数的列表,每个表示每种类型的石头的数量。
  2. 按降序对列表进行排序。
  3. 创建一个新存储桶
  4. L从头到尾运行,如果添加L到桶中的当前元素不超过r,则添加到桶中并从 中删除L
  5. 如果L为空,则返回桶数。否则返回步骤 3。

该算法是 的近似值11/9*OPT + 6/9,相当不错,并且在大多数情况下给出了非常好的结果。

该算法的运行类型为O(m log m)。如果m没有给出,要创建列表,您需要计算每种类型的石头的数量,这需要O(L)时间,整个过程也需要O((m log m) + L)时间。

于 2013-12-29T11:04:03.910 回答