工作分配問題
設有n件工作分配給n個人。將工作i分配給第j個人所需要的費用爲cij。試設計一個算法,爲每個人分配1件不同的工作,並使總費用達到最小。
樣例輸入:
3
10 2 3
2 3 4
3 4 5
樣例輸出:
9
解:
工作分配問題:
由於每個人都必須分配到工作,在這裏可以建一個二維數組c[i][j],用以表示i號工人完成j號工作所需的費用。
給定一個循環,從第1個工人開始循環分配工作,直到所有工人都分配到。
爲第i個工人分配工作時,再循環檢查每個工作是否已被分配,沒有則分配給i號工人,否則檢查下一個工作。
可以用一個一維數組x[j]來表示第j號工作是否被分配,未分配則x[j]=0,否則x[j]=1。
利用回溯思想,在工人循環結束後回到上一工人,取消此次分配的工作,而去分配下一工作直到可以分配爲止。
這樣,一直回溯到第1個工人後,就能得到所有的可行解。
在檢查工作分配時,其實就是判斷取得可行解時的二維數組的一下標都不相同,二下標同樣不相同。
#include <stdio.h>
int n;
int c[100][100];
int a[100];
int minprice=99999;
int price=0;
bool ok(int t){
int i;
for(i=0;i<t;i++)
if(a[i]==a[t])
return false;
return true;
}
void dfs(int t){
int i;
if(t==n){//爲第t個人找工作
int i;
if(price<minprice)
minprice=price;
return;
}
for(i=0;i<n;i++){
a[t]=i;//給第t個人分配第i個工作
price+=c[t][i];
if(ok(t))
dfs(t+1);
price-=c[t][i];
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&c[i][j]);
}
}
dfs(0);
printf("%d\n",minprice);
return 0;
}