问题描述:
设有n件工作分配给n个人。为第i个人分配工作j所需的费用为c[i][j] 。试设计一个算法,计算最佳工作分配方案,为每一个人都分配1 件不同的工作,并使总费用达到最小。
3
10 2 3
2 3 4
3 4 5
import java.util.Scanner;
public class GongZuoFenPei {
static int n;
static int[][] p;
static int[][] t; //标记数组
static int minP;
static int tempMinP=0;
public static void main(String[] args) {
Scanner input= new Scanner(System.in);
n=input.nextInt();
p=new int[n][n];
t=new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
p[i][j]=input.nextInt();
minP+=p[i][j];
}
}
getMinP(0);
System.out.println(minP);
input.close();
}
public static void getMinP(int k){
if(k==n){
if(tempMinP<minP){
minP=tempMinP;
}
return;
}
for (int i = 0; i < n; i++) {
if(isok(k, i)){
tempMinP+=p[k][i];
t[k][i]=1;
getMinP(k+1);
tempMinP-=p[k][i];
t[k][i]=0;
}
}
}
public static boolean isok(int k,int i){
for (int j = 0; j < n; j++) {
if(t[k][j]==1){
return false;
}
}
for (int j = 0; j < n; j++) {
if(t[j][i]==1){
return false;
}
}
return true;
}
}
另一种思路可以求n的全排列,遍历,求出最优解