演算法第五章 | 上機實踐報告
阿新 • • 發佈:2018-12-23
第五章 | 上機實踐報告
一、 實踐題目:工作分配問題
二、 問題描述
設有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.與隊友進行交流,尋求不同的解法。我原本希望能用貪心法解決此題,然實驗以失敗告終,只得乖乖用回溯法解決。