在一台超級計算機上,編號為1,2,3···的n個作業等待批處理。批處理的任務就是將這n個作業分成若干批,每批包含相鄰的若干作業。從時刻0開始,分批加工這些作業。在每批作業開始前,機器需要啟動時間s,而完成這批作業所需的時間是單獨完成批中各個作業需要時間的總和。單獨完成第i個作業所需的時間是 ti,所需的費用是它的完成時刻乘以乙個費用係數fi。同一批作業將在同一時刻完成。例如,如果在時刻 t 開始一批作業 x,x+1,x+2···x+k, 則這一批作業的完成時刻均為t+s+(tx+tx+1tx+2···+tk)。最優批處理問題就是要確定總費用最小的批處理方案。
例如,假定有5個作業等待批處理,且s=1,(t1,t2,t3,t4,t5)=(1,3,4,2,1),(f1,f2,f3,f4,f5)=(3,2,3,3,4)如果採用批處理方案(1,2),(3),(4,5),則各作業的完成時間分別為(5,5,10,14,14),各作業的費用分別為(15,10,30,42,56),因此這個批處理方案總費用是153
演算法設計:
對於給定的待批處理的個作業,計算其總費用最小的批處理方案。
樣例輸入51
1 33 2
4 32 3
1 4樣例輸出
153**
設m[i][begin]表示從時間begin開始,處理第i~n個作業的最小總費用
例如對於1-5作業來說,m[3][5]就表示在時刻5時候,開始執行3~5的作業
而3~5可以有多種批處理手法,比如:、、、
因此需要將這些情況都計算出來,取最小值
假設用j將3~5分為兩部分,有兩種分法:
1.j = 4,則將3~5分為兩部分
2.j = 5,則將3~5分為兩部分
設前一部分為第一批作業,後一部分則為第二批作業
先執行第一批作業
j = 4時,開始時間為begin,
結束時間為 ti = begin+s+t3, fi = f3, price1 = ti * fi + m[4][ti];
m[4][ti]就是 遞迴計算的最小費用
j = 5時,開始時間為begin,
結束時間為 ti = begin+s+t3+t4, fi = f5, price2 = ti * fi + m[5][ti];
通過上面的例子,可以得出以下狀態轉移方程
m[i]
[begin]
= min
(iti = begin + s + ti +
t(i+1)
+t(i+2)+
...+
t(j-1)
; fi = fi +
f(i+1)
+...
+f(j-1
);
#include
void
solve
(int n,
int s,
int t,
int f)
for(
int i = n; i >
0; i--)}
}printf
("最小總費用為:%d"
ftp上傳批處理問題
自己寫了乙個ftp推送批處理程式,出現了錯誤,程式如下 echo off echo open 10.181.22.60 12721 ftp.txt rem 使用者名稱 密碼 echo rada ftp.txt echo xxzx6135 ftp.txt echo cd ftp.txt echo lc...
最優配對問題(動態規劃)
空間裡有n個點p0,p1,p2.pn 1,你的任務是把他們配成n 2對 n是偶數 使得每個點恰好在乙個點對中。所有點的距離之和應該盡量小。n 20.定義狀態d i s 為前i個點中,位於集合s的元素兩兩配對的最小距離,則狀態轉移方程就是 d i,s min 其中 pipj 表示兩點之間的距離。邊界是...
下標處理問題
下標處理問題 主要是針對於插入排序演算法寫的程式,其他情況可以借鑑這些思路。數學上或者通常意義上,下標都是從1開始的,但是在多數程式語言裡面陣列下標都是從0開始的,這就很惱火了,簡單乙個下標處理起來卻異常麻煩!請看 例如 1 典型的陣列下標越界問題 假設有個陣列 a 0 a 1 我們要用插入法排序,...