给定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 }
作者:你的雷哥
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。