動態規劃法 1 獨立任務最優排程問題C 實現

2022-05-28 12:15:11 字數 2611 閱讀 8097

用2臺處理機a和b處理n個作業。設第i個作業交給機器a處理時需要時間,若由機器b來處理,則需要時間。由於各作業的特點和機器的效能關係,很可能對於某些i,有,而對於某些j,j≠i,有。既不能將乙個作業分開由2臺機器處理,也沒有一台機器能同時處理2個作業。設計乙個動態規劃演算法,使得這2臺機器處理完這n個作業的時間最短(從任何一台機器開工到最後一台機器停工的總時間)。研究乙個例項:(a1,a2,a3,a4,a5,a6)=(2,5,7,10,5,2);(b1,b2,b3,b4,b5,b6)=(3,8,4,11,3,4)。

對於給定的2臺處理機a和b處理n個作業,找出乙個最優排程方案,使2臺機器處理完這n個作業的時間最短。

由檔案input.txt提供輸入資料。檔案的第1行是1個正整數n, 表示要處理n個作業。接下來的2行中,每行有n個正整數,分別表示處理機a和b處理第i個作業需要的處理時間。

將計算出的最短處理時間輸出到檔案output.txt中。    

輸入檔案示例

輸出檔案示例

input.txt

output.txt

62 5 7 10 5 2

3 8 4 11 3 4

對於這個問題,我們可以考慮,當完成第k個任務時,有兩種可能:

一是a處理機完成了第k個任務,那麼b處理機完成k個任務的最短時間就與b處理機完成k-1個任務所需的最短時間是相同的

二是b處理機完成了第k個任務,那麼b處理機完成k個任務的最短時間就等於b處理機完成k-1個任務的最短時間加上b處理機完成第k個任務所需要的時間

設f[k][x]表示完成第k個任務時a耗費的時間為x的情況下b所花費的最短時間,其中0<=k <= n, 0<=x<= σai,那麼,狀態轉移方程為f[k][x]=minf[k−1][x−ak],f[k−1][x]+bk

處理好特殊情況(如x小於0時)開始填表即可。

最終的結果即是完成n個任務時a和b所需時間的較大值,即max(f[n][x], x).

1 #include2 #include3 #include

4using

namespace

std;56

int get_result(int a,int b,intn)7

15int f[n][sum+1

];16

//初始化f(b處理用的時間)的各個元素為0

17 memset(f, 0, sizeof

(f));

1819

//初始化完成第乙個任務時的情況

20for(int x=0;x0];x++)21

24 f[0][a[0]]=0;25

26//

動態規劃過程

27 sum=a[0

];28

for(int k=1;k)

2937

else

3841

if(k==n-1)42

47}48}

49return

result;50}

5152

intmain()

5364 ifs>>n;

65int a[n+1],b[n+1

];66

for(int i=0;i)

6770

for(int i=0;i)

7174

int result=get_result(a,b,n);

75 cout

76 ofs<

77ifs.close();

78ofs.close();

79return0;

8081 }

執行結果:

在get_result函式中,有兩個巢狀for迴圈,時間複雜度為o(n*sum),所以時間複雜度為o(n2)。

動態規劃解題的一般思路:

1. 將原問題分解為子問題

把原問題分解為若干個子問題,子問題和原問題形式相同或類似,只不過規模變小了。子問題都解決,原問題即解決。

子問題的解一旦求出就會被儲存,所以每個子問題只需求解一次。

2.確定狀態

在用動態規劃解題時,我們往往將和子問題相關的各個變數的一組取值,稱之為乙個「狀 態」。乙個「狀態」對應於乙個或多個子問題, 所謂某個「狀態」下的「值」,就是這個「狀 態」所對應的子問題的解。

所有「狀態」的集合,構成問題的「狀態空間」。「狀態空間」的大小,與用動態規劃解決問題的時間複雜度直接相關。 在數字三角形的例子裡,一共有n×(n+1)/2個數字,所以這個問題的狀態空間裡一共就有n×(n+1)/2個狀態。

整個問題的時間複雜度是狀態數目乘以計算每個狀態所需時間。在數字三角形裡每個「狀態」只需要經過一次,且在每個狀態上作計算所花的時間都是和n無關的常數。

3.確定一些初始狀態(邊界狀態)的值

4. 確定狀態轉移方程

定義出什麼是「狀態」,以及在該「狀態」下的「值」後,就要找出不同的狀態之間如何遷移――即如何從乙個或多個「值」已知的 「狀態」,求出另乙個「狀態」的「值」(遞推型)。狀態的遷移可以用遞推公式表示,此遞推公式也可被稱作「狀態轉移方程」。

動態規劃之獨立任務最優排程問題 問題描述

1 問題描述 用2 臺處理機a 和b 處理n個作業。設第i 個作業交給機器a 處理時需要時間ai,若由機器b來處理,則需要時間bi。由於各作業的特點和機器的效能關係,很可能對於某些i,有ai bi,而對於某些j,j i,有aj研究乙個例項 a1,a2,a3,a4,a5,a6 2,5,7,10,5,2...

動態規劃法求解TSP問題 C

此文章借鑑於博文在此基礎上重新進行了分析總結。1 怎麼求頂點子集,即這些怎麼記錄?答 例如4個頂點,依次為 十進位制數0 1 2 3 4 5 6 7的二進位制分別為000 001 010 011 100 101 110 111。上述集合中的元素即為二進位制中的位數,例如集合,可用二進位制110 十進...

動態規劃法解決0 1揹包問題 C

1.動態規劃法的設計思想 動態規劃法將待求解問題分解成若干個相互重疊的子問題,每個子問題對應決策過程的乙個階段,子問題的重疊關係一般表現在對給定問題求解的遞推關係,將子問題的的解求解一次並且填入表中,當需要再次求解子問題的時候,可以通過查表獲得這個子問題的解而不是再次求解,從而避免大量重複計算,為了...