假设我们有两个大小相同的列表,它们是截止日期和学分,它们表示课程分配。截止期限[i]表示分配i的截止日期,而功劳[i]表示分配i所获得的积分的数量。我们有一天可以完成任务,可以在截止日期之前或当天完成。我们不能同时分配多个作业。我们必须找到通过完成某些作业子集可以获得的最大信用。
因此,如果输入像截止日期= [1、2、2、2]个信用= [4、5、6、7],那么输出将是18,因为我们可以在第0天用信用5完成分配第1天以6学分分配作业,第3天以7学分完成分配作业。
为了解决这个问题,我们将遵循以下步骤-
a:=制作一对截止日期和积分,并根据积分的降序对它们进行排序
如果a为空,则
返回0
res:=大小列表(1 +截止日期的最大值)并用0填充
回答:= 0
对于a中的每个对(i,j)
如果res [k]为0,则
res [k]:= 1
ans:= ans + j
从循环中出来
对于范围i中的k降低到0,减少1,
返回ans
让我们看下面的实现以更好地理解-
class Solution: def solve(self, deadlines, credits): a = sorted(list(zip(deadlines, credits)), key=lambda x: x[1], reverse=True) if not a: return 0 res = [0] * (max(deadlines) + 1) ans = 0 for i, j in a: for k in range(i, -1, -1): if not res[k]: res[k] = 1 ans += j break return ans ob = Solution()deadlines = [1, 2, 2, 2] credits = [4, 5, 6, 7] print(ob.solve(deadlines, credits))
[1, 2, 2, 2], [4, 5, 6, 7]
输出结果
18