【工作分配问题】

问题描述:

       有n件工作分配给n个人。为第i个人分配工作j所需的费用为c[i][j] 。试设计一个算法,计算最佳工作分配方案,为每一个人都分配1 件不同的工作,并使总费用达到最小。

package 大二下学期课程设计;

        import java.util.HashMap;
        import java.util.Iterator;
        import java.util.Map.Entry;
        import java.util.Scanner;

/**
 *  有n件工作分配给n个人。为第i个人分配工作j所需的费用为c[i][j] 。
 *  试设计一个算法,计算最佳工作分配方案,为每一个人都分配1 件不同的工作,
 *  并使总费用达到最小。
 */
public class 工作分配问题1 {


    static int n = 0;                           // 工作人数
    static int cost = 0;                        // 工作费用
    static int[] w = new int[100];              // 一维数组判断工作种类是否被安排 
    static int[][] c = new int[100][100];       // 二维数组初始化   每个工作和费用

    
    static HashMap fna = new HashMap<>();    //当前工作分配状态


    public static void main(String[] args) {

        System.out.println("工作人数为:");
        Scanner s = new Scanner(System.in);
        n = s.nextInt();
        System.out.println("不同人不同工作的费用为:");
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                c[i][j] = s.nextInt();
                w[j] = 0; // 第j个工作未被分配

            }

            cost += c[i][i];
            fna.put(i,i);

        }

        Workerswork(1, 0);
        System.out.println("最后费用为:" + cost);

        Iterator> iter = fna.entrySet().iterator();
        while(iter.hasNext()) {
            Entry t = iter.next();
            System.out.println(t.getKey() + "号工人做了第" + t.getValue() + "种工作");
        }

    }

    static HashMap ts = new HashMap<>();

    public static void Workerswork(int i, int count) {
        if (i > n && count < cost) {
            cost = count;
            fna.putAll(ts);
            return;
        }
        if (count < cost) {
            for (int j = 1; j <= n; j++) {
                if (w[j] == 0) { // 如果第j个工作未被安排
                    w[j] = 1;
                    ts.put(i,j);
                    Workerswork(i + 1, count + c[i][j]); // 如果第j个工作被安排之后,该工作不能被其他人选择,行数加一
                    w[j] = 0;
                }
            }

        }
    }
}

运行结果:

【工作分配问题】_第1张图片

 

 

你可能感兴趣的:(JISUANJI)