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;//回溯
}
}
}
}
}