带可变耗时的作业调度问题:高效算法及DP有效性问询
你的DP算法是否属于高效多项式时间算法?
不属于。你提出的DP时间复杂度为O(N * max(d_i)),其中max(d_i)是任务的最大截止时间。这里的关键在于:多项式时间算法的复杂度必须是输入规模的多项式函数,而输入中截止时间d_i是用二进制编码存储的,其输入规模是log(max(d_i))量级,而非max(d_i)本身。当max(d_i)很大(比如达到1e9)时,这个算法的时间开销会呈指数级增长,因此它属于伪多项式时间算法,不是严格意义上的高效多项式时间算法。
存在的高效多项式时间算法
这个问题可以通过以下步骤实现多项式时间求解:
任务排序:首先将所有任务按照截止时间
d_i从小到大排序。如果截止时间相同,可按耗时t_i从小到大排序(不影响最终结果,仅优化选择顺序)。动态规划优化:定义
dp[j]为完成j个任务所需的最小总时间。初始状态dp[0] = 0,其余dp[j] = ∞(表示无法完成j个任务)。对于每个排序后的任务
i,从后往前遍历j(从当前已能完成的最大任务数开始,直到1):- 如果
dp[j-1] + t_i ≤ d_i,说明可以将第i个任务加入到完成j-1个任务的序列中,此时更新dp[j] = min(dp[j], dp[j-1] + t_i)。
- 如果
确定最优解:遍历
dp数组,找到最大的j使得dp[j]不为∞,这个j就是能满足截止时间的最大任务数。之后可通过回溯DP数组得到具体的调度方案。
该算法的时间复杂度为O(N²),属于严格的多项式时间算法,因为N是任务数量,输入规模与N线性相关。
补充说明
你提到的经典1单位时间任务调度的贪心算法(优先处理截止时间最近的任务)无法直接推广到耗时任意的场景——选择短耗时的任务可能能容纳更多任务,仅看截止时间可能会导致总耗时超标。而上述DP方法通过追踪完成k个任务的最小时间,确保了我们能找到最优的任务组合。
内容的提问来源于stack exchange,提问作者mega-rototo

