Loading

独立任务最优问题

问题

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

思路

对于n个任务,有一部分任务\(x(0\le x\le n)\)是交给A完成,另一部分\(y(0\le y\le n)\)交给B完成,那么某个调度的结果就是:A处理完\(x\)个任务的时间和B处理完\(y\)个任务的时间的最大值。

本题要让我们在所有调度的方案,选取最少花费时间。

\(i\)表示处理完前\(i\)个任务的状态,\(j\)表示A处理完\(i\)中某些任务花费的时间。通过这两个状态(集合),我们就能够确定B处理完\(i\)个任务中,剩下部分的任务需要花费的时间,即为\(f(i,j)\)。我们也就有状态(集合)\((i,j)\)来表示某类调度方案。

对于当前的状态\((i,j)\),我们可以从两个角度转移过来:

  1. 对于第\(i\)个任务,交给B处理,那么就有\((i-1,j)\to (i,j)\)。A没有处理任何任务,所以\(j\)不变
  2. 对于第\(i\)个任务,交给A处理,那么就有\((i-1,j-a_i)\to (i,j)\)。即A花费了\(a_i\)时间处理完任务\(j\)

在A花费的时间\(j\)固定的情况下,为了求最少的花费时间,我们要让\(f(i,j)\)最小,所以根据上面的转移关系,就能得到转移方程。

\[f(i,j)=min(f(i-1,j)+b_i,f(i-1,j-a_i)) \]

那么完成\(n\)个任务后,B处理完成的时间就是\(f(n,j)\),所以答案就是\(min(max(j,f(n,j)))\)

posted @ 2022-06-11 22:57  Frank_Ou  阅读(47)  评论(0编辑  收藏  举报