3

我有一个项目清单,每个项目都需要两天时间才能完成,并且有一个截止日期。设P[i].id、P[i].duedate、p[i].value分别为项目的id、项目的截止日期、按时完成项目获得的价值(on或截止日期前)

编写一个算法,将数组 A 作为输入,并返回您将执行哪些项目以及何时执行的时间表,以最大化您获得的价值。该算法的输出是一个数组 B,其中 B[i] 是您将在第 i 天工作的项目的 ID,i>= 1。

在特定日期不超过一个项目,除非您在截止日期前完成,否则您不会获得项目的价值,今天是第 0 天,您将从第 1 天开始处理项目(截止日期是一个整数),例如,如果一个项目的截止日期是 5,您可以选择在第 3 天和第 5 天工作)

1-编写算法。2-证明算法是最优的?3-算法的时间复杂度是多少?

4

1 回答 1

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] 选择之后,此任务不应该在 V[i-2] 选择中。

最后我会留给你完成你的作业,找出这个算法的顺序和它的正确性,你也可以提高内存使用率。

于 2012-05-07T22:47:45.517 回答