回溯法解决工作分配问题

回溯法解决工作分配问题
问题描述:
设有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);

}
}

本人小白一名,还请各位大佬多多指教!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值