给定一系列工作,其中每个工作都有截止日期(d_i> 0)和相关的执行时间(e_i> 0),即 我们得到了一个(d_i,e_i)数组,我们可以找到一个工作安排,以便可以安排所有这些工作。可能有更多可能的答案,任何一个都足够了。
e.g。 {(3,1),(3,2),(7,3)} {J1,J2,J3} 答案可能是其中之一{J1,J2,J3}或{J2,J1,J3}
我们可以使用回溯来解决这个问题,但运行时间会很长。我们可以使用贪婪或任何其他方法解决这个问题吗?请提供它的正确性。
编辑: 一次最多只能运行一份工作。
答案 0 :(得分:0)
提示:成功安排k个初始作业后,只有当下一个作业的执行时间在k个前一个作业之后的执行时间添加到当前时间小于或等于该作业时,才能找到满意的完整计划。下一份工作的截止时间。你能明白为什么总是在选择工作的每个步骤中选择下一个工作的最早期限将决定是否存在解决方案,如果存在,是否会提供精确的解决方案?如果您想了解有关如何证明这一点的详细信息,请告诉我,但希望您现在可以自己看到它,因为我已经指出了正确的贪婪解决方案。
更新:进一步暗示:假设你有一个令人满意的任务,其中两个连续的工作根据他们的截止日期发生故障(这只是意味着工作的整体排序按照截止日期以某种方式发生故障)。然后可以在两个截止日期的早期截止日期之前完成这两项工作。因此,也可以在之后的截止日期之前通过交换作业完成两个作业,这仍然是一个令人满意的作业,因为通过假设您现在将在上一次完成之前完成前一个截止日期作业,假设,并且两个人的最后期限晚于最早的截止日期,之前仍有可能找到令人满意的任务。
因此,如果存在令人满意的任务,那么存在另一个存在根据其截止日期排序工作的工作。也就是说,贪婪的策略总会找到一个令人满意的任务,如果存在的话 - 否则就没有解决方案。
答案 1 :(得分:0)
基于堆数据结构的O(nlogn)Greedy方法
输入是作业数组
struct Job
{
char id;
int deadLine;
int profit;
}
算法伪代码:
1.Sort the input jobArray in non-decresing order of deadLine.
2.create a maxHeap (will consists of job).Basis of Comparison is profit
3.let n=length of jobArray
initialize time=jobArray[n-1].deadLine
index=n-1
4.while index>=0 && jobArray[index].deadLine >= time
4a) insert(maxHeap,jobArray[index])
4b) index=index-1
5. j=removeMax(maxHeap)
print j.id
time=time-1
6.if time > 0
goto step 4.
else
return ;
这将按相反的顺序打印作业。 可以修改它以正确的顺序打印;