[英]divide n players to m teams to minimize the team difference in Java
我遇到了问题,需要SO的聪明才智帮助。 我想将n名球员分为m个队。 每个玩家都有不同的游戏能力。 能力用正整数或负整数表示。 团队的总能力只是分配给该团队的人员的能力得分之和。
我的目标是找到总能力最大的团队和总能力最小的团队之间的最小差异。 限制条件是,每个球员都必须放在一个团队中,并且每个团队必须至少有一个成员。
例如,如果我有以下具有能力的球员:[1、2、3、4、5、6、7]并想组成三支球队。 因此,拥有最大总能力的团队和拥有最小总能力的团队之间的最小可能差为1。一种可能的解决方案是:
团队1:1 + 3 + 6 = 10
小组2:2 + 7 = 9
团队3:4 + 5 = 9
我试图通过使用以下策略来划分玩家:
1.能力分类
2.每次将剩下的最高能力的玩家分配到能力最低的组中,直到没有玩家为止
此策略适用于某些问题。 这是我到目前为止的代码:
public int minDifference(int numTeams, int[] abilities) {
ArrayList<ArrayList<Integer>> teams = new ArrayList<ArrayList<Integer>>();
int[] teamSum = new int[numTeams];
for(int i = 0; i < numTeams; i++){
teams.add(new ArrayList<Integer>());
teamSum[i] = 0;
}
Arrays.sort(abilities);
for(int i = abilities.length - 1; i >= 0; i--){
int minSum = teamSum[0];
int minNum = 0;
for(int j = 1; j < numTeams; j++){
if(teamSum[j] < minSum){
minSum = teamSum[j];
minNum = j;
}
}
teams.get(minNum).add(abilities[i]);
teamSum[minNum] += abilities[i];
}
Arrays.sort(teamSum);
System.out.println(teamSum[numTeams - 1] - teamSum[0]);
return teamSum[numTeams - 1] - teamSum[0];
}
现在我被困住了。 我的想法是比较两个团队。 说A和B。如果A-B = 10,Tom-Jerry = 3,则来自A的玩家Tom和来自B的Jerry。 然后交换汤姆和杰瑞。 所以现在A-B = 4。 并继续这样做。 但是似乎比较太多(因为您还需要计算两队球员之间的差异),而且我不知道何时停止(意味着我怎么知道这是最低限度的)。
我非常确定这是一个NP问题,因为我们是否可以将球员分为两队而没有差异的决定是属于NPC的子集和问题 。 解决这个问题的多项式时间解都不正确(或者可以说NP = P),所以不要在思考多项式解上浪费时间,而要尝试完整的搜索(我想所有可能的解决方案..),如果如果您认为它太慢,可以尝试启发式搜索。
我想这样。 您可以添加所有能力并按团队数量进行划分,而不是尝试得出总能力尽可能接近该数量的团队
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.