第五章 | 上机实践报告
一、 实践题目:工作分配问题
二、 问题描述
设有n件工作分配给n个人。将工作i分配给第j个人所需的费用为Cij。对于给定的所有工作费用,为每一个人都分配1件不同的工作,使总费用达到最小。
三、 算法描述
1.解题思路:以第一份工作为结点构造子集树,在Backtrack函数中进行深度搜索。如果sum > bestp,则该分支不满足条件,需要进行剪枝,而后回溯;如果满足sum < bestp,则继续深搜,直至叶节点;如果sum < bestp 且 已搜索至根节点时,则再次得到更优解。在整棵子集树遍历完毕后,最终得到问题的最优解。
2.代码如下:
void Backtrack(int t) { for (int r = 1; r <= n; r++) { if (sum > bestp) continue; if (!b[r]) { b[r] = 1; sum += a[t][r]; if (t == n) { if (sum < bestp) bestp = sum; } else if (sum < bestp) Backtrack(t + 1); sum -= a[t][r]; b[r] = 0; } } }
四、 心得体会
1.对于典型的子集树问题,可套用子集树模板进行回溯、剪枝,从而求解问题。
2.对于模板的实现能力有待提升。
3.与队友进行交流,寻求不同的解法。我原本希望能用贪心法解决此题,然实验以失败告终,只得乖乖用回溯法解决。