我有一个项目列表,每个项目都需要两天才能完成并且有截止日期。让 P [i] .id,P [i] .duedate和p [i] .value 成为项目的ID,项目的截止日期以及您获得的价值按时完成项目(在截止日期或之前)
编写算法,该算法作为输入数组A并返回您将要执行的项目和时间的计划,以最大化您获得的值。 算法的输出是一个数组B,这样B [i]就是你在第i天工作的项目的id,i> = 1。
在特定日期不超过一个项目,除非在截止日期前完成,否则您无法获得项目的价值,今天是第0天,您将从第1天开始处理项目(截止日期是整数),例如,如果项目的截止日期是5,您可以选择在第3天和第5天进行处理)
1-写算法。 2-证明算法是最优的? 3-算法的时间复杂度是多少?
答案 0 :(得分:0)
如果所有值都相同则很简单,只需选择最少的截止日期就可以选择贪婪的方法。
当值不同时,您可以使用类似的方法,但这次是通过动态编程(我假设您的截止日期是离散的)。
创建一个大小为Max{due date}
的数组,将其命名为V
,此数组包含可在特定时间内获得的最大可能值,以及V
中每个值保存的另一个数组相关V[i]
中的所选任务,现在您有了这个DP选项:
V [0] = 0,V [1] = max {value_x 1 ,V [i] = Max {V [i-2] + value_x i ,V [i-1]}
这里value_x i 表示到期日等于或小于i
的最大值任务,此更新不应该在V [i-2]选择中,在更新之后V [i]选择。
最后,我将通过查找此算法的顺序及其正确性来完成您的作业,还可以提高内存使用率。