Algorithm “的最大数量”;团队“;

Algorithm “的最大数量”;团队“;,algorithm,grouping,Algorithm,Grouping,我对团队有一个定义。我需要根据一份人员列表(及其适用的时间段)找到我能得到的最大数量的团队,因为一旦一个人被“使用”了一个时间段,他们就不能再被使用 简化示例: **Team Requirements** Slot A: 2 People Slot B: 1 Person Slot C: 1 Person **People And Which Slots Are Applicable** Person 1: A Person 2: A,C Person 3: A,B Person 4: B P

我对团队有一个定义。我需要根据一份人员列表(及其适用的时间段)找到我能得到的最大数量的团队,因为一旦一个人被“使用”了一个时间段,他们就不能再被使用

简化示例:

**Team Requirements**
Slot A: 2 People
Slot B: 1 Person
Slot C: 1 Person

**People And Which Slots Are Applicable**
Person 1: A
Person 2: A,C
Person 3: A,B
Person 4: B
Person 5: A,B
Person 6: C
Person 7: C
Person 8: A
可能的答案

Team 1
A: P1, P8
B: P4
C: P6

Team 2
A: P2, P3
B: P5
C: P7
对于我的现实问题,我有多个位置(每个团队1-10个)和1-1000人,每个人最多可以有20个位置


有谁能推荐一种适合这类群优化问题的算法吗?

这可以通过在一系列图中的每一个图中找到一个来解决,总时间为O(n^2.5 logn)

为此,首先将每个插槽类型转换为一组适当数量的不同插槽,这样我们就得到了插槽A1、A2、B、C。最终的解决方案将为特定团队中的特定插槽分配一个人(例如,团队1中的插槽A2由第三个人),但我们可以简单地忘记“2”(还有团队的排序,这同样纯粹是人为的)

首先计算团队数量的乐观估计k:四舍五入(n/4)可以,因为每个团队使用4个人,所以我们不能有更多的团队。现在在二分图的一部分中创建4k个顶点——也就是说,每个k个潜在团队的4个插槽中的每个插槽都有一个顶点:A1_1,A2_1,B_1,C_1,A1_2,A2_2,…,A1_k,A2_k,B_k,C_k。在二分图的另一部分中,为e创建一个顶点每个人。最后,将每个人的顶点与允许他们填充的所有插槽顶点连接起来:例如,如果一个人x可以占用插槽a或C,那么他们应该通过一条边连接到每个以“a”或“C”开头的插槽(对于8人的示例,这将是6条边)


然后,在此图上解决MCBM问题,例如,在O(n^2.5)中使用的时间。结果将是边的子集,可以解释为将每个人分配给团队中最多一个插槽,并在团队中的每个插槽中填充最多一个人。如果这导致每个插槽都被填充,万岁!我们有尽可能多的团队。否则,如果有一些团队插槽未填充由任何人领导,减少团队数量,然后重试。(每次可以将团队数量减少1,这会导致需要解决的MCBM问题的线性数量,但可以通过二进制搜索节省时间。这意味着开始时将团队数量减半,然后将团队数量减少或增加一半,从而在某些团队有未完成任务时减少这是一场编程竞赛吗?如果不是,请给出问题的链接。谷歌的术语是“分配问题”.@Salvador-不,这不是一个编程竞赛。这是一个现实世界中的商业问题。因为这个问题非常专业,所以实际上没有任何联系。@j_random_hacker-谢谢,我会看一看。@j_random_hacker-我不确定这与任务有什么关系,因为没有真正的“成本”每一组。我是否遗漏了什么?