问题描述
给定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个作业,制定最佳的作业调度方案,使其完成时间和最小。
input
2 1
3 1
2 3
output
18
1 3 2
#include<stdio.h>
#include<stdlib.h>
int n;
int **willdo;
int *order;
int *bestorder;
int min=100000,temptime=0;
int f1=0,f2=0;
void input()
{
int i;
printf("输入作业的数目\n");
scanf("%d",&n);
willdo=(int **)malloc(sizeof(int*)*n);
for(int i=0;i<n;i++)
{
willdo[i]=(int *)malloc(sizeof(int)*2);
}
printf("输入机器1的工作时间\n");
for(i=0;i<n;i++)
{
scanf("%d",&willdo[i][0]);
}
printf("输入机器2的工作时间\n");
for(i=0;i<n;i++)
{
scanf("%d",&willdo[i][1]);
}
order=(int *)malloc(sizeof(int)*n);
bestorder=(int *)malloc(sizeof(int)*n);
}
void init()
{
int i;
for(i=0;i<n;i++)
{
order[i]=i;
}
}
void swaps(int a,int b)
{
int temp=order[a];
order[a]=order[b];
order[b]=temp;
}
void permutaion(int h)
{
if(h==n)
{
if(temptime<min)
{
for(int j=0;j<n;j++)
{
bestorder[j]=order[j];
}
min=temptime;
}
return ;
}
int temp;//记录一下f2
for(int i=h;i<n;i++)
{
f1+=willdo[order[i]][0];
temp=f2;
f2=(f2>f1?f2:f1)+willdo[order[i]][1];
temptime+=f2;
swaps(h,i);
permutaion(h+1);
swaps(h,i);
f1-=willdo[order[i]][0];
//f2=(f2>f1?f2:f1)-willdo[h][1];//这么做是错误的因为f2和f1已经发生了变化
temptime-=f2;
f2=temp;//正确做法
}
}
int main()
{
input();
init();
permutaion(0);
printf("%d\n",min);
for(int i=0;i<n;i++)
{
printf("%d\t",bestorder[i]+1);
}
printf("\n");
return 0;
}
结果