将n名玩家分成m个团队,以最小化Java中的团队差异

将n名玩家分成m个团队,以最小化Java中的团队差异,java,algorithm,recursion,Java,Algorithm,Recursion,我被一个问题困住了,我需要一些聪明人的帮助。我想把n名球员分成m个队。每个玩家都有不同的游戏能力。能力由正整数或负整数表示。一个团队的总能力只是分配给该团队的人员的能力得分之和 我的目标是找出总能力最大的团队和总能力最小的团队之间可能存在的最小差异。限制条件是每个球员必须被安排在一个团队中,并且每个团队必须至少有一名成员 例如,如果我有以下有能力的玩家:[1,2,3,4,5,6,7],并且想要组成三支球队。因此,总能力最大的团队和总能力最小的团队之间的最小可能差异为1。一种可能的解决办法是: 第

我被一个问题困住了,我需要一些聪明人的帮助。我想把n名球员分成m个队。每个玩家都有不同的游戏能力。能力由正整数或负整数表示。一个团队的总能力只是分配给该团队的人员的能力得分之和

我的目标是找出总能力最大的团队和总能力最小的团队之间可能存在的最小差异。限制条件是每个球员必须被安排在一个团队中,并且每个团队必须至少有一名成员

例如,如果我有以下有能力的玩家:[1,2,3,4,5,6,7],并且想要组成三支球队。因此,总能力最大的团队和总能力最小的团队之间的最小可能差异为1。一种可能的解决办法是:

第一队:1+3+6=10

第二组:2+7=9

第三组: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];
    }
public int mindtifference(int numTeams,int[]能力){
ArrayList团队=新建ArrayList();
int[]团队总数=新的int[numTeams];
对于(int i=0;i=0;i--){
int minSum=teamSum[0];
int minNum=0;
对于(int j=1;j
现在我被卡住了。我的想法是比较两支球队。假设A和B。玩家汤姆来自A,杰瑞来自B。如果A-B=10,汤姆-杰瑞=3;然后交换汤姆和杰瑞。所以A-B=4
现在。继续这样做。但似乎有太多的比较(因为你还需要计算两队球员之间的差异),我不知道什么时候停止(意味着我怎么知道这是最小值)

我是这样想的。你可以把所有的能力加起来,然后按球队的数量来划分,然后再尝试找出总能力尽可能接近这个数字的球队,我很确定这是一个NP问题,因为我们是否可以把球员分成两支没有差别的球队是属于NPC的。这个问题的任何多项式时间解决方案都是不正确的(或者你可以说NP=P),所以不要浪费时间思考多项式解决方案,只要尝试完全搜索(我的意思是尝试所有m^n可能的解决方案…),如果你觉得太慢,你可以尝试启发式搜索。

如果问题不清楚,很抱歉。我想把n名球员分成m支球队,尽量缩小能力最高的球队和能力最低的球队之间的能力差异。你自己试过吗?如果是的话,你能分享它并解释你需要什么帮助吗?因此,这不是编码或算法服务,我们不是来解决您的问题,只是来回答您的问题。向我们展示,我们能够帮助您。我们不是代码编写服务(我们中的一些人通过编写代码来挣钱)。“我想要…”提示。问题可能以“如何…”开头,通常以“?”结尾。你提出的问题越清楚,得到回答的机会就越大。如果这是你的问题,请把它放到问题中去。你对数组的大小有限制吗?对于人数较少的人来说,使用蛮力可能是合理的。否则,这可能是一个没有“精确”算法的优化问题。你的尝试(至少你的描述)通常被称为“爬山”。以下是维基百科关于优化算法的参考资料:。这里有一个类似的问题:是的,但是你能澄清一下“然后试着建立一个总能力尽可能接近这个数字的团队”吗?他和以前有同样的问题(蛮力方法或更聪明的算法,然后…哪一个?)保留所有能力的“大”列表,为每个团队列出一个列表并执行以下操作。你有团队所需要的能力。在“大”列表中找到最接近的能力,将其从“大”列表中删除,将其添加到团队列表中,更新所需能力递归执行,直到所需能力=0左右。。。为每个团队做这件事。。。一个可能的策略。不,这只会是一线队的一个好选择(其他人只能选择前人没有使用过的)。我认为,在任何情况下,这个问题都不能有效地解决,这是一种启发式方法,在某些情况下可以给出令人满意的答案。参见我对这个问题的评论和相关链接。当然,复杂性很快会随着M的增加而增长到一个不可接受的水平(那么可能需要一些启发)。也就是说,启发式不能太原始(它必须足够好,我认为你的方法不是)。可能存在从子集和到OPs问题的减少,但我认为这不是显而易见的问题。使用子集和,所有的负整数归一组(比如A),所有的非负整数归另一组(比如B)。然后你会试图找出a的一个子组,其和等于B的和的一个子组(数量级)。在这个问题中,每个团队都有精确的限制(数组大小)/(团队数量)。此外,不能将数组的元素仅限于一个团队。很难说清楚,但“明显的热度”