任务分配算法

n个人n个任务进行分配,每个人一个任务,每个人分配任务的成本不同,求最小的分配成本

 

public class 任务分配 {
    //测试用,将n设置为4个任务;
    static int n=4;
    //sum代表最终任务分配的最小价值,初始将任务设置为最大值
    static int sum=Integer.MAX_VALUE;
    //vis数组是一个标志位(索引0没有使用,索引1-4对应4个任务,
    // 数组元素值为1,表明对应任务被别人分配
    static int[] vis=new int[5];
    //行是人,列是任务
    //0行0列无用,初始为0
    static int[][] a={
            {0,0,0,0,0},
            {0,1,2,3,4},
            {0,4,3,2,1},
            {0,2,2,2,2},
            {0,1,1,1,1},
    };

    public static void main(String[] args) {
        work(1,0);
        System.out.println(sum);
    }

    /**
     *
     * @param i  当前为第i个人分配任务,
     * @param count 当前任务了的任务所需的成本
     */
    static void work(int i, int count)
    {
        if (i > n && count < sum)//分配完最后一个人,并且当前分配的成本小于之前的成本
        {
            sum = count;
            return;
        }

        if (count < sum)//如果没分配到最后一个人,并且当前分配的成本小于之前分配的最小成本。
                        //否则直接退出
        {
            for (int j = 1; j <= n; j++)
            {
                if (vis[j] == 0)//只有当前任务没有被分配才进入if语句
                {
                    vis[j] = 1;//试探
                    work(i + 1, count + a[i][j]);//递归调用,为下一个人分配
                    vis[j] = 0;//回溯
                }
            }
        }
    }
}

 

posted @ 2020-10-15 16:46  浪~子  阅读(3284)  评论(0编辑  收藏  举报