1. 程式人生 > >批處理作業排程問題

批處理作業排程問題

給定n個作業的集合J={J1,J2,…,Jn}。每一個作業有兩項任務分別在兩臺機器上完成。每個作業必須先由機器1處理,再由機器2處理。作業Ji需要機器j的處理時間為tji,i=1,2,…n,j=1,2。對於一個確定的作業排程,設Fji是作業i在機器j上完成處理的時間。則所有作業在機器2上完成處理的時間和f=F21+F22+…+F2n稱為該作業排程的完成時間和。

        批處理作業排程問題要求,對於給定的n個作業,制定最佳的作業排程方案,使其完成時間和最小。

 


樣例輸入

3
2 1
3 1
2 3
樣例輸出
18
1 3 2
自己在紙上畫畫示例的圖,並結合著排列數的回溯很容易寫出程式碼

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 int x[100][2];
 5 int x1[100];
 6 int x2[100];
 7 int sum1=0,sum2=0;
 8 int best=100000;
 9 int num;
10 void swap(int &a,int &b){
11  int temp;
12  temp=a;
13  a=b;
14  b=temp;
15 }
16 void backtrace(int level)
17 {
18 if(level>n){ 19 20 sum1=0; 21 sum2=0; 22 num=0; 23 for(int i=1;i<=n;i++){ 24 sum1+=x[x1[i]][0]; 25 int temp=max(sum1,sum2); 26 sum2=(temp+x[x1[i]][1]); 27 num+=sum2; 28 }
29 if(num<best){ 30 best=num; 31 for(int i=1;i<=n;i++){ 32 x2[i]=x1[i]; 33 } 34 } 35 }else{ 36 for(int i=level;i<=n;i++){ 37 swap(x1[level],x1[i]); 38 backtrace(level+1); 39 swap(x1[level],x1[i]); 40 } 41 } 42 } 43 int main() 44 { 45 cin >> n; 46 for(int i=1;i<=n;i++){ 47 for(int j=0;j<=1;j++){ 48 cin >> x[i][j]; 49 } 50 } 51 for(int i=1;i<=n;i++){ 52 x1[i]=i; 53 } 54 backtrace(1); 55 cout << best << endl; 56 for(int i=1;i<=n;i++){ 57 cout << x2[i]<< " "; 58 } 59 return 0; 60 }