假设我们有三个长度相同的列表。这些是截止日期,积分和期限。他们代表课程作业。对于第i个作业,截止日期[i]显示其截止日期,积分[i]显示其积分,持续时间[i]显示完成任务所需的天数。必须先完成一项作业,然后再开始另一项作业。我们必须牢记,我们可以在到期日完成任务,而目前我们处于第0天的开始。
因此,如果输入为:截止日期= [7,5,10],积分= [8,7,10],持续时间= [5,4,10],则输出将为10。
为了解决这个问题,我们将遵循以下步骤-
工作:=对列表进行排序 zip(deadlines, durations, credits)
定义一个功能dp()。
如果我> =工作规模,则
返回0
ans:= dp(i + 1,天)
期限,期限,信用:=工作[i]
如果天+持续时间− 1 <=截止日期,则
ans:= ans的最大值,dp(i + 1,天+持续时间)+信用
返回ans
从主方法返回dp(0,0)
让我们看下面的实现以更好地理解-
class Solution: def solve(self, deadlines, credits, durations): jobs = sorted(zip(deadlines, durations, credits)) def dp(i=0, day=0): if i >= len(jobs): return 0 ans = dp(i + 1, day) deadline, duration, credit = jobs[i] if day + duration − 1 <= deadline: ans = max(ans, dp(i + 1, day + duration) + credit) return ans return dp() ob = Solution() deadlines = [7, 5, 10] credits = [8, 7, 10] durations = [5, 4, 10] print(ob.solve(deadlines, credits, durations))
[7, 5, 10], [8, 7, 10], [5, 4, 10]输出结果
10