工作分配问题
问题描述:
设有n件工作分配给n个人。将工作i分配给第j个人需要支付的劳务费为cij,请设计算法,为每个人都分配1件不同的工作,并使得总劳务费达到最小。
实现提示:
该问题的解空间是一棵排列树,可用搜索排列树的回溯框架实现。
输入格式:
输入数据的第一行为1 个正整数n (1≤n≤20),表示工作的数量,随后输入n行,每行n个数,表示相应的劳务费。
输入样例:
3
10 2 3
2 3 4
3 4 5
输出样例:
9
import java.util.Scanner;
public class Assignment_problem {//工作分配问题
public static int sum = 0,n;
public static int [][] num;//存对应的劳务费
public static boolean []bool;//bool[i] == true表示第i项工作已经被分配
public static int min = Integer.MAX_VALUE;
public static void main(String []args) {
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
num = new int[n + 1][n + 1];
bool = new boolean[n + 1];//默认为false
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= n;j++) {
num[i][j] = scanner.nextInt();
}
}
f(1);
System.out.println(min);
}
public static void f(int a) {// a 表示第几个人
if(a == n + 1) {//表示工作已经分配完
if(sum < min) {
min = sum;
}
return;
}
for(int i = 1;i <= n;i++) {
if(!bool[i]) {
sum += num[a][i];//遍历
bool[i] = true;//表示第i项工作已经分配
f(a + 1);
sum -= num[a][i];//剪枝
bool[i] = false;
}
}
}
}