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