n个人n个任务进行分配,每个人一个任务,每个人分配任务的成本不同,求最小的分配成本
public class 任务分配 {
//测试用,将n设置为4个任务;
static int n=4;
//sum代表最终任务分配的最小价值,初始将任务设置为最大值
static int sum=Integer.MAX_VALUE;
//vis数组是一个标志位(索引0没有使用,索引1-4对应4个任务,
// 数组元素值为1,表明对应任务被别人分配
static int[] vis=new int[5];
//行是人,列是任务
//0行0列无用,初始为0
static int[][] a={
{0,0,0,0,0},
{0,1,2,3,4},
{0,4,3,2,1},
{0,2,2,2,2},
{0,1,1,1,1},
};
public static void main(String[] args) {
work(1,0);
System.out.println(sum);
}
/**
*
* @param i 当前为第i个人分配任务,
* @param count 当前任务了的任务所需的成本
*/
static void work(int i, int count)
{
if (i > n && count < sum)//分配完最后一个人,并且当前分配的成本小于之前的成本
{
sum = count;
return;
}
if (count < sum)//如果没分配到最后一个人,并且当前分配的成本小于之前分配的最小成本。
//否则直接退出
{
for (int j = 1; j <= n; j++)
{
if (vis[j] == 0)//只有当前任务没有被分配才进入if语句
{
vis[j] = 1;//试探
work(i + 1, count + a[i][j]);//递归调用,为下一个人分配
vis[j] = 0;//回溯
}
}
}
}
}