批處理作業調度問題


給定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 }

 


免責聲明!

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



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