工作分配问题
问题重述:
设有n件工作分配给n个人。将工作i分配给j个人所需的费用为cij.设计一个算法,为每一个人都分配1件不同的工作,并使总费用达到最小。
例子:
第一个工作分配该三个人的相应费用:10,2,3
第二个工作分配该三个人的相应费用:2,3,4
第三个工作分配该三个人的相应费用:3,4,5
解:方案:工作安排2,1,3分配给三个工作。
#include<stdio.h>
#include<math.h>
/*
名称:swap
功能:交换两个整数
输入:
输出:
作者:刘荣
时间:2013/5/17
备注:
*/
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
/*
名称:next
功能:递归求解最优方案
输入:
输出:
作者:刘荣
时间:2013/5/17
备注:
*/
void next(int i,int n, int c[][3], int *x, int &bestv, int *bestx)
{
int j,v;
if(i > n)//到达叶子节点
{
v=0;
for(int k=1; k <= n; k++)
{
v += c[k-1][x[k-1]];
}
if(v < bestv)
{
bestv = v;
for(int k=1; k <= n; k++)
{
bestx[k-1] = x[k-1];//记录下最有方案
}
}
return;
}
//组合排列
for(j = i; j <= n; j++)
{
swap(x[i-1],x[j-1]);
next(i+1,n,c,x,bestv,bestx);
swap(x[i-1], x[j-1]);
}
}
/*
名称:solve
功能:开始求解,包括初始化
输入:
输出:
作者:刘荣
时间:2013/5/17
备注:
*/
void solve(int n,int c[][3], int *bestx, int &bestv)
{
int i;
int *x = new int[n];
for(i = 1; i <= n; i++)
{
x[i-1] = i-1;
}
bestv = 0;
for(i = 1; i <= n; i++)
{
bestv += c[i-1][i-1];
}
next(1,n,c,x,bestv,bestx);
}
int main()
{
int n = 3;
int c[][3] = {{10,2,3},{2,3,4},{3,4,5}};
int *bestx = new int[n];
int bestv=0;
solve(n,c,bestx,bestv);
printf("最优工作安排的时间:%d \n\r",bestv);
printf("最优工作安排: \n\r");
for(int i = 1;i <= n; i++)
{
printf("工作%d:第%d个人,",i,bestx[i-1]+1);
}
return 0;
}