批处理作业调度问题

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

猜你喜欢

转载自www.cnblogs.com/henuliulei/p/10196118.html