在Python中找到通过完成一些任务获得的最大学分的程序
假设我们有两个相同大小的列表,它们是截止日期和学分列表,代表了课程作业。这里的deadlines[i]表示第i个作业的截止日期,credits[i]表示我们获得的第i个作业的学分数量。我们有一天时间来完成一个作业,这个作业可以在截止日期之前或截止日期当天完成。我们不能同时完成多个作业。我们需要找到通过完成一些作业子集可以获得的最大学分。
因此,如果输入为deadlines = [1, 2, 2, 2]和credits = [4, 5, 6, 7],则输出将为18,因为我们可以在第0天完成学分为5的作业,在第1天完成学分为6的作业,在第3天完成学分为7的作业。
为了解决这个问题,我们将按照以下步骤操作-
- a:=制作一个带有截止日期和学分的二元组,并根据降序排列学分
- 如果a是空的,则
- 返回0
- res:=大小为(截止日期的最大值+1)的列表,并用0进行填充
- ans:=0
- 对于a中的每对(i,j),执行以下操作
- 对于范围为i递减的k,请执行以下操作
- 如果res[k]为0,则
- res[k]:=1
- ans:=ans+j
- 退出循环
- 对于范围为i递减的k,请执行以下操作
- 返回ans
让我们看以下实现以更好地理解-
更多Python相关文章,请阅读:Python 教程
例子
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