1. 程式人生 > >【實踐】第五章上機實踐

【實踐】第五章上機實踐

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了。第二題和結隊隊友思考了一下就找到了解空間,後面思考如何剪枝的時候想得太複雜了所以把自己繞了進去,後面發現其實沒有自己想得那麼複雜,很快就解了出來。回溯法真的很萬能!