1、实践题目

  工作分配问题

2、问题描述

  设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。

3、算法描述(包括解空间,画出测试样例的解空间树,剪枝(约束函数或限界函数)方法描述)

void backtrack(int t)
{
if(t>n)
{
if(sum<bestp)
bestp=sum;

}

else
{
for(int i=1;i<=n;i++)
{
if(x[i]==0 && a[t][i]+sum<bestp)
{
sum=sum+a[t][i];
x[i]=1;
backtrack(t+1);
sum=sum-a[t][i];
x[i]=0;


}
}

}

}

  a1解空间为{1,2,,3。。。。。。n},a2解空间有n-1个选择。代表每个人选择第几个任务,解空间树中每一层代表就是每个人所选择的任务,并且选择之后不能被其他人选中。利用数组X[I]标记哪些任务被选中,约束函数为当前这个工人选择的任务的开销加上之前的开销综合要比最优的选择少 a[t][i]+sum<bestp,而本题的时间算法要求只需要一个限界函数就不会超时,并不需要上限函数。

4、心得体会(对本次实践收获及疑惑进行总结)

回溯法主要是用于筛选比较得出可行的方案,理解了解空间和约束函数之后,更有利于减少错误。