JAVA算法,求最优平均算法。尽可能平均

题目:
现有大约1000个左右催收单,需要发给20个左右催收员。每个催收单的金额不同要求对每个催收员分配到的催收单,尽可能的在金额上都比较平均。金额涉及到奖金,不能不公平处理
要求:
写出实现方法、单元测试代码
例如 30 20 30 20 20
分成 2组
1。30 30
2。20 20 20
分成三组
1。30
2。20 20
3。20 30

1个回答

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class CollectionDebit {

//催缴单费用list
static List<Integer> debitList=new ArrayList<Integer>();
//催收员个数
static Integer num=20;

//催缴员及对应账单
static Map<Integer,List<Integer>> map=new HashMap<Integer,List<Integer>>();

public static void main(String[] args) {
    //随机生成催缴单
    Random random=new Random();
    for(int i=0;i<1000;i++){
        debitList.add(random.nextInt(200));
    }
    //把账单按从大到小排序
    Collections.sort(debitList,new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            if(o1>o2){
                return -1;
            }else if(o1<o2){
                return 1;
            }
            return 0;
        }
    });

    //初始化map
    List<Integer> list=null;
    Integer count=num;
    for(;count>0;count--){
        list=new ArrayList<Integer>();
        map.put(count, list);
    }

    //分配催缴单
    divideDebit(debitList,num,true);

    //打印分配结果
    for(Integer key:map.keySet()){
        System.out.print("催缴员"+key+"催缴的账单为:");
        Integer total=0;
        for(Integer i:map.get(key)){
            total=total+i;
            System.out.print(i+"-");
        }
        System.out.println("催缴员"+key+"催缴的账单总额为:"+total);
    }

}

public static void divideDebit(List<Integer> dList,Integer num,boolean direction){
    if(dList.size()>=num){//账单大于人数
        for(int i=0;i<num;i++){
            Integer index;
            if(direction){
                index=i+1;
            }else{
                index=num-i;
            }
            List<Integer> list=map.get(index);
            list.add(dList.get(i));
            map.put(index, list);
        }
        //去除已经分配的账单
        List<Integer> newDebitList=new ArrayList<Integer>();
        for(int i=0;i<dList.size();i++){
            if(i>num-1){
                newDebitList.add(dList.get(i));
            }
        }
        //
        if(newDebitList.size()>0){
            //下次分配账单,按反方向分配
            divideDebit(newDebitList,num,!direction);
        }
    }else if(dList.size()<num){//账单小于人数
        for(int i=0;i<dList.size();i++){
            List<Integer> list=map.get(i+1);
            list.add(dList.get(i));
            map.put(i+1, list);
        }
    }

}

}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问