假设你有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很远。谁能收紧约束?
答案 0 :(得分:0)
您可以使用first-fit algorithm进行装箱问题,几乎不需要进行任何修改:
L
个整数的列表m
,每个整数代表每种类型的宝石数量。L
,如果将当前元素L
添加到存储区不超过r
,请添加到存储区并将其从{{{}移除1}}。L
为空,则返回桶数。否则回到第3步。这个算法是L
的近似值,这是相当不错的,在大多数情况下给出了非常好的结果。
此算法的运行类型为11/9*OPT + 6/9
。如果未给出O(m log m)
,要创建列表,您需要计算每种类型的宝石数量,这需要m
时间,整个过程将花费O(L)
时间。