题目描述
用 台处理机 和 处理 个作业。
设第 个作业交给机器 处理时需要时间 ,若由机器 来处理,则需要时间 。由于各作业的特点和机器的性能关系,很可能对于某些 ,有 ,而对于某些 , ,有 。既不能将一个作业分开由 台机器处理,也没有一台机器能同时处理2个作业。
题目分析
分析问题我们发现,每个任务只有两种选择,即由 或 处理,于是我们便可以想到暴力的解法,即依次对每个任务的两种选择进行枚举,记录 和 所用时间中较大值的最小值。时间复杂度为 。
接下来考虑动态规划进行优化。
三维动态规划
定义 表示第 项任务交给 , 机器完成所需要的时间, 表示是否可以使用 机器时间 , 机器时间 的情况下完成前 个任务。
首先定义 机器最大用时 ,即 单独工作时间 的情况下,均能够完成 个任务。 为 则表示可以完成,为 则表示无法完成。初始化 为 ,意为任意时间均可完成 项任务。
转移方程为 ,意为在完成前 项任务后,在当前时间限制下,机器A能否留出时间 或 机器能否留出时间 完成任务 。
最终答案为完成 项任务的 对中较大值的最小值。
Accept 核心代码
for (int i = 0; i <= m; i ++)
for (int j = 0; j <= m; j ++)
f[i][j][0] = 1;
for (int k = 1; k <= n; k ++)
for (int i = 0; i <= m; i ++)
for (int j = 0; j <= m; j ++)
{
if (i >= a[k]) f[i][j][k] |= f[i - a[k]][j][k - 1];
if (j >= b[k]) f[i][j][k] |= f[i][j - b[k]][k - 1];
}
int res = 100;
for (int i = 0; i <= m; i ++)
for (int j = 0; j <= m; j ++)
if (f[i][j][n])
{
res = min(res, max(i, j));
break;
}
cout << res << "\n";