【3-2】最優批處理問題


問題描述:
在一台超級計算機上,編號為1,2, ,  n 的 n 個作業等待批處理。批處理的任務就是將
這 n 個作業分成若干批,每批包含相鄰的若干作業。從時刻 0 開始,分批加工這些作業。在
每批作業開始前,機器需要啟動時間 S ,而完成這批作業所需的時間是單獨完成批中各個作
業需要時間的總和。單獨完成第i 個作業所需的時間是 i
t ,所需的費用是它的完成時刻乘以
一個費用系數 i
f 。同一批作業將在同一時刻完成。例如,如果在時刻T 開始一批作業
x x x k , 1, ,    ,則這一批作業的完成時刻均為 1
( ) T S t t t      x x x k    。最優批處理
問題就是要確定總費用最小的批處理方案。例如,假定有 5 個作業等待批處理,且
1 2 3 4 5 1 2 3 4 5 S t t t t t f f f f f    1,( , , , , ) (1,3, 4, 2,1),( , , , , ) (3, 2,3,3,4)
如果采用批處理方案{1,2},{3},{4,5},則各作業的完成時間分別為(5,5,10,14,14) ,各
作業的費用分別為(15,10,30, 42,56) ,因此,這個批處理方案總費用是 153。
算法設計:
對於給定的待批處理的n 個作業,計算其總費用最小的批處理方案。
數據輸入:
由文件 input.txt 提供輸入數據。文件的第 1 行是待批處理的作業數n , 第 2 行是啟動
時間 S 。接下來每行有 2 個數,分別為單獨完成第i 個作業所需的時間是 i
t 和所需的費用系
數 i
f 。
結果輸出:
將計算出的最小總費用輸出到文件 output.txt 中。
輸入文件示例 輸出文件示例
input.txt output.txt
5
1
1 3
3 2
4 3
2 3
1 4
153

【題解】

設dp[i]表示i..n這些作業完成花費的最少時間 則dp[i] = min(dp[j]+(f[i]+f[i+1]+..+f[n])(S+t[i]+t[i+1]+...+t[j-1])); 把i,i+1,i+2..j-1作為第一段 N^2的算法.O(N)的還是算了吧。。。

【代碼】

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 10000;
const int M = 1e4;

int n,s;
int t[N+10],f[N+10];
int tt[N+10],ff[N+10];
int dp[N+10];

int main(){
    //freopen("C://Users//Administrator//Desktop//測試數據//ch3//prog32//test//batch20.in","r",stdin);
    cin >> n;
    cin >> s;
    for (int i = 1;i <= n;i++) cin >> t[i] >> f[i];
    for (int i = n;i >= 1;i--){
        tt[i] = tt[i+1] + t[i];
        ff[i] = ff[i+1] + f[i];
    }
    dp[n+1] = 0;
    for (int i = n;i >= 1;i--){
        dp[i] = -1;
        for (int j = i+1;j <= n+1;j++){
            int temp = dp[j] + ff[i]*(s+tt[i]-tt[j]);
            if (dp[i]==-1) dp[i] = temp;
            else dp[i] = min(dp[i],temp);
        }
    }
    printf("%d\n",dp[1]);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM