獨立任務最優排程問題

2021-08-20 23:10:17 字數 1389 閱讀 6319

題目:用2 臺處理機a 和b 處理n 個作業。設第i 個作業交給機器a 處理時需要時間i a ,若由機器b 來處理,則需要時間i b 。由於各作業的特點和機器的效能關係,很可能對於某些i,有ai >=bi,而對於某些j,j≠i,有aj < bj 。既不能將乙個作業分開由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 個作業的時間最短。

輸入:

6

2 5 7 10 5 2

3 8 4 11 3 4

輸出:
15
題解:利用dp儲存每個狀態的結果,最後選出最優的乙個解。轉換方程:dp[i][j]=min(dp[i-1][j]+b[i],dp[i-1][j-a[i]]);dp[i][j]代表做完前i個任務,a機器花幾分鐘情況下,b機器所花的時間,也就是說dp[i][j]就是表示b機器所花時間。

dp[i][j] = dp[i-1][j]+b[i]代表第i個任務交給b來做,所以做完前i個任務的時候,a機器和前i - 1的任務一樣,還是花了j分鐘,而b機器則花dp[i-1][j]+b[i]分鐘;

dp[i][j] = dp[i-1][j-a[i]]代表第i個任務交給a來做,現在的a機器花費時間是j,所以在前i - 1個任務完成的時候,a機器是花了j-a[i]分鐘的,所以現在b機器還是花了dp[i-1][j-a[i]]分鐘;

一直到dp[n][i]:代表所有的任務都做完了,b機器所花費的時間,那麼最遲的時間就是b的時間和a的時間求最大值;

for(int i=0; i<=sum; i++)ans=min(ans,max(dp[n][i],i));//max(dp[n][i],i) 表示完成前n個作業a機器花i分鐘 b機器花dp[n][i]分鐘情況下,最遲完工時間 

**:#include#include#includeusing namespace std;

int a[201], b[201];

int n;

int dp[202][10000];//dp[i][j] 表示前i個作業中a機器花j分鐘的時候 b機器所花時間

int main(int argc, char* argv)

}int ans=999999;

//max(dp[n][i],i) 表示完成前n個作業a機器花i分鐘 b機器花dp[n][i]分鐘情況下,最遲完工時間

for(int i=0; i<=sum; i++)ans=min(ans,max(dp[n][i],i));

cout<

獨立任務最優排程問題

用2臺處理機a和b處理n個作業。設第i個作業交給機器a處理時需要時間ai,若由機器b來處理,則需要時間bi。由於各作業的特點和機器的效能關係,很可能對於某些i,有ai bi,而對於某些j,j不等於i,有aj第一行是乙個正整數n,表示要處理n個作業。在接下來的兩行中,每行有n個正整數,分別表示處理機a...

獨立任務最優排程

include using namespace std int main int b int sum 0 for int i 0 i n i int m new int n m為b機器的使用時間,i為第幾個工作入隊,j為a機器使用時間 for int i 0 i n i for int i 0 i ...

獨立任務最優排程

題目描述 用2臺處理機a和b處理n個作業。設第i個作業交給機器a處理時需要時間ai,若由機器b來處理,則需要時間bi。由於各作業的特點和機器的效能關係,很可能對於某些i,有ai bi,而對於某些j,j i,有aja k 時,f k x min f k 1 x b k f k 1 x a k 否則f ...