算法第五章上机实践报告
一 . 实践题目
7-2 工作分配问题
二 . 问题描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为cij 。 设计一个算法,对于给定的工作费用,为每一个人都分配1 件不同的工作,并使总费用达到最小。
输入格式:
输入数据的第一行有1 个正整数n (1≤n≤20)。接下来的n行,每行n个数,表示工作费用。
输出格式:
将计算出的最小总费用输出到屏幕。
输入样例:
3
10 2 3
2 3 4
3 4 5
输出样例:
9
三 . 算法描述
1. 解空间
第一个人选择第几个工作,第二个人选择第几个工作,第三个人选择第几个工作......
这道题是一个排列数问题
2.解空间树
3.约束函数
cc:当前总费用
bestc:当前最佳费用
if (cc+a[i][x[j]]<bestc){
cc+=a[i][x[j]];
swap(x[i], x[j]);
Backtrack(i+1);
swap(x[i], x[j]);
cc-=a[i][x[j]];
}
4.核心代码
void Backtrack (int i) { if (i>n){ if(cc < bestc){ bestc = cc; } return; } else{ for (int j=i;j<=n;j++) { if (cc+a[i][x[j]]<bestc){ cc+=a[i][x[j]]; swap(x[i], x[j]); Backtrack(i+1); swap(x[i], x[j]); cc-=a[i][x[j]]; } } } }
四 . 心得体会
我和同伴一开始对于回溯法的理解都不够,实验课的时候我们做第一题但是一直过不了,没有来得及看第二题。
课后做了第二题,对回溯法有了进一步的理解,但是我们现在做题还是依赖于去套框架,还需要加强理解。