给定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个作业,制定最佳的作业调度方案,使其完成时间和最小。
参考代码如下:
#include <stdio.h>
int f, f1,*f2,bestf;
int *bestX,*x;
int n;
int **M;
void backtrack(int t)
{
int i,j,k;
int temp;
if(t>n)
{
for(i=0;i<=n;i++)
bestX[i]=x[i];
bestf=f;
}
else
{
for(j=t;j<=n;j++)
{
f1+=M[x[j]][0];
f2[t]=(f2[t-1]>f1?f2[t-1]:f1)+M[x[j]][1];
f+=f2[t];
if(f<bestf){
temp=x[t]; x[t]=x[j]; x[j]=temp;
backtrack(t+1);
temp=x[t]; x[t]=x[j]; x[j]=temp;
}
f1-=M[x[j]][0];
f-=f2[t];
}
}
}
int main()
{
int i,j,k;
printf("input the number of homework:");
scanf("%d", &n);
M=new int *[n+1];
for(i=1;i<=n;i++)
M[i]=new int [2];
printf("input the time consumed:");
for(i=1;i<=n;i++)
{
for(j=0;j<2;j++)
scanf("%d",&M[i][j]);
}
f1=0; f=0; bestf=1000;
f2=new int[n+1];
bestX=new int [n+1];
x=new int[n+1];
for(i=0;i<=n;i++)
{
f2[i]=0;
x[i]=i;
}
backtrack(1);
for(i=1;i<=n;i++)
printf("%d ",bestX[i]);
printf("\n%d ",bestf);
return 0;
}