【實踐】第五章上機實踐
阿新 • • 發佈:2018-12-20
1、實踐題目:工作分配問題
2、問題描述
設有n件工作分配給n個人。將工作i分配給第j個人所需的費用為cij 。 設計一個演算法,對於給定的工作費用,為每一個人都分配1 件不同的工作,並使總費用達到最小。
輸入:
輸入資料的第一行有1 個正整數n (1≤n≤20)。接下來的n行,每行n個數,表示工作費用。
輸出:
將計算出的最小總費用輸出到螢幕。
3、演算法描述
解空間:
建一個二維陣列c[i][j],用以表示將工作i分配給第j個人所需的費用。給定一個迴圈,從第1個工作開始迴圈分配工人,直到所有工作都分配到。為第i個工作分配工人時,檢查該工人是否合適,合適則分配給該號工人,否則檢查下一個工人。可以用一個一維陣列x[j]來表示第j號工人是否被分配。使用排列樹,其中level i 代表工作i,每一個節點引出剩餘工人人數個branch。
解空間樹:排列樹
剪枝描述:
在每次計算區域性費用變數cp的值時,如果判斷cp已經大於mins,就沒必要再往下分配了。
if(cp + w[t][x[i]] < mins) { cp += w[t][x[i]]; sw(t, i); backtrack(t+1); sw(i, t); cp -= w[t][x[i]]; }
4、心得體會
這次實踐題的第一題和老師上課講的o-1揹包問題一樣,只要先把物品都按照單位價值按降序排好,再嚴格一點地剪枝就能ac了。第二題和結隊隊友思考了一下就找到了解空間,後面思考如何剪枝的時候想得太複雜了所以把自己繞了進去,後面發現其實沒有自己想得那麼複雜,很快就解了出來。回溯法真的很萬能!