讲解一下这道题:# 榨取kkksc03## 题目描述洛谷 2 的团队功能是其他任何 OJ 和工具难以达到的。借助洛谷强大的服务器资源任何学校都可以在洛谷上零成本的搭建 OJ 并高效率的完成训练计划。为什么说是搭建 OJ 呢?为什么高效呢?!httpscdnluogucomcnuploadpic1236png因为你可以上传私有题目团队外别人是无法看到的。我们还能帮你们评测!你可以创建作业给组员布置任
这道题是一个背包问题,需要用动态规划的方法来解决。
首先,我们定义一个二维数组dp,其中dp[i][j]表示在前i个愿望中,花费不超过j元钱的情况下,最多可以实现的愿望个数。
然后,我们可以通过以下状态转移方程来计算dp数组的值:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-m[i]] + 1)
其中m[i]表示第i个愿望所需要的金钱,即第i行的第一个数。
根据转移方程,我们可以使用一个双重循环来计算dp数组的值。外层循环遍历愿望的个数i,内层循环遍历金钱的范围j。
最后,dp[n][M]就是我们要求的答案,即在手上剩余M元钱的情况下,最多可以实现的愿望个数。
下面是具体的代码实现:
n, M, T = map(int, input().split()) # 输入n, M, T
wishes = [] # 存储愿望的金钱和时间
for _ in range(n):
m, t = map(int, input().split())
wishes.append((m, t))
dp = [[0] * (M+1) for _ in range(n+1)] # 初始化dp数组
for i in range(1, n+1):
for j in range(1, M+1):
dp[i][j] = dp[i-1][j] # 不选择第i个愿望
if j >= wishes[i-1][0] and T >= wishes[i-1][1]:
dp[i][j] = max(dp[i][j], dp[i-1][j-wishes[i-1][0]] + 1) # 选择第i个愿望
print(dp[n][M]) # 输出结果
这样,我们就可以通过动态规划的方法解决这道题目了
原文地址: https://www.cveoy.top/t/topic/iZ3B 著作权归作者所有。请勿转载和采集!