如何在 k 个人之间分配 n 个对象的 x 个副本

How to allocate x copy of n objects among k persons

我有以下用例;

我有 N 个不同的项目,每个项目可以有 x 个副本。现在我需要将这些物品分发给 k 个人,其中每个人的能力各不相同,可以 <=N.

必须满足以下条件;

每个人只能获得一份物品

示例:

Items = apple , banana , orange
copies = 3 ( It means we have 3 apples , 3 bananas and 3 oranges )
So I have a array;
{1,2,3,4,5,6,7,8,9} // 1,2,3 = 3 apples ; 4,5,6 = 3 banana ; 7,8,9 = 3 oranges
Total Person = 5
Person     Capacity
P1         3
P2         2
P3         1
P4         1
P5         2

我该如何解决这样的问题?我面临的问题是,当我将它分配给 N 、 x 、 k 的任意数字时,我有时会遇到这样一种情况,即我剩下一些要分配的项目,因为我无法确保 "Each person should get one and only one copy of an Item"

由于每一项都有相同的“重量”,其实你可以贪婪地解决这个问题。为了确保每个人收到不同的物品,我们通过重复 N 不同物品的序列 x 次来创建包含所有 xN 物品的序列。然后,我们遍历每个人并简单地删除并分配给他们这个序列的前 c 项,其中 c 是那个人的承载能力。

之所以可行,是因为我们布置项目的方式以及 c <= N。在我们的“mega”序列中,重复项总是 N 索引彼此远离,因此 c 连续元素永远不会包含两个重复项。重复项只会出现在包含超过 N 项的连续子序列中。

请注意,在该算法的实现中,您实际上不必创建 mega 序列;您可以使用模块化算法简单地重复迭代不同的项目序列。为了简单起见,我将在示例中形成“mega”项目序列,但您不必在实现中这样做。

以您问题中的示例为例,让 3 个不同的项目成为 A, B, C,每个项目有 3 个副本。 “mega”序列是通过重复不同的项目序列 3 次形成的:A, B, C, A, B, C, A, B, C。现在我们检查每个人并简单地分配他们可以携带的物品数量。为了说明这一点,请考虑容量数组的以下情况(取自您的问题和下面的评论):

  • [3, 2, 1, 1, 2]:P1获得A, B, C,P2获得A, B,P3获得C,P4获得A,P5获得B, C.
  • [2, 2, 2, 2, 1]:P1获得A, B,P2获得C, A,P3获得B, C,P4获得A, B,P5获得C.
  • [3, 1, 1, 1, 1, 2]:P1 获得 A, B, C,P2 获得 A,P3 获得 B,P4 获得 C,P5 获得 A , P6 得到 B, C.