我的问题可以简化为以下几点:
问题陈述:
我有n
个商品和m
个消费者。每个项目都有一些s
(正整数)。
在一个步骤中,每个消费者都可以选择一个项目,并将其大小减少1
。两个消费者不能选择相同的商品,一个商品可以不被选择(想象一个从消费者到商品的内在功能)。
我的问题:
消耗所有项目所需的最小步骤数(所有项目的大小为0)是什么?
注意:我不确定这个问题的复杂性,如果解决方案不是最优的,我很好,接近最佳状态就好了。
示例:
// First example:
// number of items
n = 4;
// size of each item, itemSizes[i] represents the size of item i
int[] itemSizes = {1, 1, 2, 4};
// number of consumers
m = 3;
// the result should be 4
int result = computeMinimumNumberOfSteps(n, m, itemSizes);
// Second example:
// number of items
n = 4;
// size of each item, itemSizes[i] represents the size of item i
int[] itemSizes = {4, 9, 5, 5};
// number of consumers
m = 2;
// the result should be 13
int result = computeMinimumNumberOfSteps(n, m, itemSizes);
我的方法:
我使用贪婪的方法。我曾经重复以下步骤,直到所有物品被消耗掉:
m
个最大的项目(排序并选择m
size != 0
项
这似乎很慢,现在我做了:
m
个最大的项目(排序并选择m
size != 0
项
min
个项目中找到最小值m
。min
(合并多个消耗步骤)这似乎仍然太慢了。您如何看待我的方法?有没有办法进一步提高速度?
此外,问题似乎很普遍,你知道我的问题可以减少的任何众所周知的问题吗?
答案 0 :(得分:3)
您的问题等同于调度问题P | pmtn | C max ,即您有多台并行机器P,您的作业可以被抢占(pmtn)并且您希望最小化最大值品牌时间C max 。
McNaughton的规则为这个问题提供了最佳解决方案,您可以在David Karger等人的论文Scheduling Algorithms中找到它的参考。 (第2.3.1章)。基本上,您为消费者分配任意项目,直到达到 D = max(sum(itemsizes)/ m,max(itemSizes)),然后继续下一个消费者。因此,该算法的运行时间为 D 。