回溯法解决工作分配问题
问题描述:
设有n件工作分配给n个人。为第i个人分配工作j所需的费用为c[i][j] 。试设计一个算法,计算最佳工作分配方案,为每一个人都分配1 件不同的工作,并使总费用达到最小。
代码块如下:
package suanfa;
import java.util.Scanner;
public class 工作分配问题回溯法 {
static int n,cost=0; //耗资cost为0 n为员工数量
static int c[][]=new int[100][100]; //各员工在各工作上的工资
static void work(int i,int count , int x[]){
if(i>n && count<cost){//各个工作安排完毕且为更优解
cost = count;//更新最优解
showResult(x);//展示方案
return;
}
if(count<cost)
for(int j=1;j<=n;j++)
if(x[j] == 0){ //j表示员工,判断其是否被安排
x[j] = i; //i表示工作
count+=c[j][i];
work(i+1,count,x);
x[j] = 0;
count-=c[j][i];
}
}
static void showResult(int x[]) {
int pay=0;
for(int i=1;i<x.length;i++) {
System.out.println(" 员 工 ("+i+") 工 作 :"+x[i]+" 工 资 为 :"+c[i][x[i]]);
pay+=c[i][x[i]];
}
System.out.println
(" 当 前 耗 资 为 :"+pay+"\n ------------------------------------");
}
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
System.out.print(" 请 输 入 员 工 数 量 :");//输入问题规模
n=sc.nextInt();
int x[]=new int[n+1];//用于记录工作安排
System.out.println(" 输入各员工在各工作的工资");
System.out.print(" 工 作 编 号 :");
for(int i=1;i<=n;i++) System.out.print(i+" ");
System.out.println();
for(int i=1;i<=n;i++){
System.out.print(" 员 工 编 号 ("+i+"):");
for(int j=1;j<=n;j++){
c[i][j]=sc.nextInt();//输入各个数据
x[j] = 0; //初始化工作安排
}
cost+=c[i][i]; //初始耗资:按员工顺序安排工作
}
//展示初始安排信息
System.out.println(" 初 始 工 作 安 排-----------------------");
for(int i=1;i<x.length;i++)
System.out.println(" 员 工 ("+i+") 工 作 :"+i+" 工 资 为 :"+c[i][i]);
System.out.println(" 初 始 工 作 安 排 耗 资 :"+cost+"");
//展示更优化安排方案
System.out.println(" 更 优 工 作 安 排-----------------------");
work(1,0,x);//i表示员工,从第1个员工安排工作
System.out.println(" 预 计 最 少 耗 资 :"+cost);
}
}
本人小白一名,还请各位大佬多多指教!!!