问题描述
我试图证明 the following algorithm 是完全正确的(部分正确性 + 终止),但我似乎只能证明任意示例输入(不是一般输入)。
Here is my pseudo-code:
IN :Listofjobs J,maxindex n
1:S ← an array indexed 0 to n,with null at each index
2:Sort J in non-increasing order of profits
3:for i from 0 to n
4:Find the largest t such that S[t] = null and t ≤ J[i].deadline (if one exists) if an index t was found
5: S[t] ← J[i]
OUT: S maximizes the profit of scheduled jobs that can be done in n 1 unit of time blocks
例如,我创建了一个包含工作及其相关属性(截止日期和利润)的表:
jOB J1 J2 J3 J4 J5
Deadline 2 1 3 2 1
profit 62 100 20 40 20
从这个示例输入中,我们可以做 J2、J1、J3,总利润为 182。
有人能帮我形成一个更通用的方式来证明我的伪代码算法是完全正确的吗?
解决方法
添加约束可以帮助您。
在第 2 步中,首先按不增加利润排序 J,然后按不增加截止日期排序。
在所有最佳解决方案中,至少有一个必须按照工作利润的时间顺序按字典顺序排在最后。 (如果多个作业具有相同的利润和截止日期,则可能存在多个按字典顺序排列在最后的最优解。)
证明任何没有与您放置的第一个工作同时获得相同利润的工作的任何解决方案要么不是最佳的,要么在最佳解决方案中按字典顺序排在最后。
通过归纳证明您找到的解决方案在作业大小的放置方面与任何最佳解决方案相同,并且在最佳解决方案中按字典顺序排列。
请注意,这只是一个大纲。这个证明的每一步都需要一些微妙的技巧,我特意留下作为练习。