设有n件工作分配给n个人。将工作i分配给第j个人所需要的费用为cij。试设计一个算法,为每个人分配1件不同的工作,并使总费用达到最小。
样例输入:
3
10 2 3
2 3 4
3 4 5
样例输出:
9
排列树求解:
#include<stdio.h>
#define n 3
int value[n][n]={10,2,3,2,3,4,3,4,5};
int a[n]={0,1,2}; //代表人
int minvalue=999999;
int tempvalue;
void traceback(int t)
{
int i,temp;
if(t==n)
{
tempvalue=0;
for(i=0;i<n;i++)
{
tempvalue+=value[a[i]][i]; //第a[i]个人做第i个工作
}
if(tempvalue<minvalue)
{
minvalue=tempvalue;
}
return;
}
for(i=t;i<n;i++)
{
temp=a[i];
a[i]=a[t];
a[t]=temp;
traceback(t+1);
temp=a[i];
a[i]=a[t];
a[t]=temp;
}
}
int main()
{
traceback(0);
printf("%d\n",minvalue);
return 0;
}