算法第五章 | 上机实践报告

第五章 | 上机实践报告

一、 实践题目:工作分配问题

二、 问题描述

设有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.与队友进行交流,寻求不同的解法。我原本希望能用贪心法解决此题,然实验以失败告终,只得乖乖用回溯法解决。

猜你喜欢

转载自www.cnblogs.com/ljl-gd/p/10137109.html