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