在Python中找到通过完成一些任务获得的最大学分的程序

在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
      • 退出循环
  • 返回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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程