如何在 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
.
我有以下用例;
我有 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
.