独立任务最优调度问题

问题描述:

独立任务最优调度,又称双机调度问题:用两台处理机A和B处理n个作业。设第i个作业交给机器A处理时所需要的时间是a[i],若由机器B来处理,则所需要的时间是b[i]。现在要求每个作业只能由一台机器处理,每台机器都不能同时处理两个作业。设计一个动态规划算法,使得这两台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。

数据输入: n = 6   

a[n] = 2 5 7 10 5 2   b[n] = 6 8 4 11 3 4

结果输出: 15

思路:当完成k个作业,设机器A花费了x时间,机器B所花费时间的最小值肯定是x的一个函数,设F[k][x]表示机器B所花费时间的最小值,则 F[k][x]=Min{ F[k-1][x]+b[k], F[k-1][x-a[k]] }F[k-1][x]+b[k]表示第k个作业由机器B来处理(完成k-1个作业时机器A花费的时间仍是x,前提就是A机器停机的时间是x),F[k-1][x-a[k]]表示第k个作业由机器A处理(完成k-1个作业时机器A花费的时间是x-a[k])。

我们可知机器A花费时间x与机器B花费时间F[k][x]中的较大值为AB机器完成任务k的最终时间:Max(x, F[k][x])。当x = 0,1,2……sumA,可得到一串较大值序列,取序列中最小的值即为结果。

#include 

int main()
{
   int n, i, k;
   int sumA = 0;
   int result = 1000000000;
   printf("请输入任务数:\n");
   scanf("%d", &n);

   int a[n], b[n];

   printf("A机器的工作时间:\n");
   for( i = 0; i < n; i++)
   {
       scanf("%d", &a[i]);
       sumA = sumA+a[i];
   }

   int t[sumA+1];
   for( i = 0; i < n; i++)
    t[i] = 0;

   printf("B机器的工作时间:\n");
   for( i = 0; i < n; i++)
   {
       scanf("%d", &b[i]);
   }

   for( k = 0; k < n; k++)
   {
       for( i = sumA; i >= 0; i--)
       {
           if(i >= a[k 
            t[i] = t[i]+b[k] < t[i-a[k]]?t[i]+b[k]:t[i-a[k]];
           else
            t[i] = t[i]+b[k];
       }
   }
   for( i = 0; i<= sumA; i++)
   {
       k = i>t[i]?i:t[i];
       if(result>k)
        result = k;
   }
   printf("%d\n", result);
   return 0;
}


 

你可能感兴趣的:(算法)