【3-1】獨立任務最優調度問題


´問題描述:
用 2 台處理機 A 和 B 處理 n 個作業。設第 i 個作業交給機器 A 處理時需要時間 i
a ,若
由機器 B 來處理,則需要時間 i
b 。由於各作業的特點和機器的性能關系,很可能對於某些 i,
有 i i
a ³ b ,而對於某些 j,j≠i,有a j < 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 個作業的時間最短。
´數據輸入:
由文件 input.txt 提供輸入數據。文件的第 1 行是 1 個正整數 n, 表示要處理 n 個作業。
接下來的 2 行中,每行有 n 個正整數,分別表示處理機 A 和 B 處理第 i 個作業需要的處理時
間。
´結果輸出:
程序運行結束時,將計算出的最短處理時間輸出到文件 output.txt 中。
輸入文件示例 輸出文件示例
input.txt output.txt
6
2 5 7 10 5 2
3 8 4 11 3 4
15

【題解】

設f[i][j]表示前i個作業A機器用了j時間的條件下B最少花費的時間 f[i][j] = min(f[i-1][j-a[i]],f[i-1][j]+b[i]);//給A做或給B做

【代碼】

/*
    設f[i][j]表示前i個作業A機器用了j時間的條件下B最少花費的時間
    f[i][j] = min(f[i-1][j-a[i]],f[i-1][j]+b[i]);//給A做或給B做
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

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

int f[N+10][M+10];
int n,a[N+10],b[N+10];

int main(){

    freopen("C://Users//Administrator//Desktop//測試數據//ch3//prog31//test//sched10.in","r",stdin);
    scanf("%d",&n);
    for (int i = 1;i <= n;i++) scanf("%d",&a[i]);
    for (int i = 1;i <= n;i++) scanf("%d",&b[i]);
    memset(f,0x3f3f3f3f,sizeof f);
    f[0][0] = 0;
    for (int i = 1;i <= n;i++)
        for (int j = 0;j <= M;j++){
            if (j>=a[i]) f[i][j] = min(f[i][j],f[i-1][j-a[i]]);
            f[i][j] = min(f[i][j],f[i-1][j]+b[i]);
        }
    int ans = f[n][0];
    for (int j = 1;j <= M;j++) ans = min(ans,max(f[n][j],j));
    printf("%d\n",ans);
    return 0;
}


免責聲明!

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



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