1. 程式人生 > >演算法第五章 | 上機實踐報告

演算法第五章 | 上機實踐報告

第五章 | 上機實踐報告

一、 實踐題目:工作分配問題

二、 問題描述

設有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.與隊友進行交流,尋求不同的解法。我原本希望能用貪心法解決此題,然實驗以失敗告終,只得乖乖用回溯法解決。