批处理作业调度

来源:互联网 发布:caxa机械制图软件 编辑:程序博客网 时间:2024/05/21 00:52
/*    批处理作业调度    输入: 3          2 1          3 1          2 3    输出:18          1 3 2*/#include <stdio.h>#include <stdlib.h>#include <limits.h>#define MAXSIZE 100int n;                  //作业的个数int m1[MAXSIZE];        //每个作业在机器一上完成的时间int m2[MAXSIZE];        //每个作业在机器二上完成的时间int f1;                 //机器一完成的时间int f2[MAXSIZE];        //机器二完成的时间int cf;                 //当前所用时间int bestf;              //当前最优时间int x[MAXSIZE];         //当前解int bestx[MAXSIZE];     //最优解//输入void input();//初始化void init();//回溯法void backtrack(int);//交换void Swap(int*, int*);int main(void){    int i = 1;    while (1)    {        input();        init();        backtrack(1);        printf("%d\n", bestf);        for (i = 1; i <= n; ++i)        {            printf("%d ", bestx[i]);        }        printf("\n");    }    return 0;}void input(){    int i = 1;    printf("please enter n:");    scanf("%d", &n);    for (i = 1; i <= n; ++i)    {        scanf("%d %d", &m1[i], &m2[i]);    }}void init(){    int i = 1;    cf = 0;    bestf = INT_MAX;    f1 = 0;    for (i = 1; i <= n; ++i)    {        x[i] = i;        f2[i] = 0;    }}void backtrack(int t){    int i = 1;    int j = 1;    if (t > n)    {        if (cf < bestf)        {            bestf = cf;            for (i = 1; i <= n; ++i)            {                bestx[i] = x[i];            }        }    }    else    {        for (j = t; j <= n; ++j)        {            f1 +=  m1[x[j]];            f2[t] = (f1 > f2[t - 1] ? f1 : f2[t - 1]) + m2[x[j]];            cf += f2[t];            if (cf < bestf)            {                Swap(&x[t], &x[j]);                backtrack(t + 1);                Swap(&x[t], &x[j]);            }            f1 -=  m1[x[j]];            cf -= f2[t];        }    }}void Swap(int *a, int *b){    int temp = *a;    *a = *b;    *b = temp;}

原创粉丝点击