华为笔试机考丨牛客每天一道·三道编程题O题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
def main():
N, m = map(int, input().split())
N = N // 10
items = [tuple(map(int, input().split())) for _ in range(m)]
primary, accessory = [], [[] for _ in range(m)]
for i, item in enumerate(items):
if item[2] == 0:
primary.append((item[0] // 10, item[1] * item[0], i))
else:
accessory[item[2] - 1].append((item[0] // 10, item[1] * item[0]))
dp = [0] * (N + 1)
for item in primary:
for i in range(N, item[0] - 1, -1):
dp[i] = max(dp[i], dp[i - item[0]] + item[1])
for acc in accessory[item[2]]:
if i >= item[0] + acc[0]:
dp[i] = max(dp[i], dp[i - item[0] - acc[0]] + item[1] + acc[1])
if len(accessory[item[2]]) > 1:
acc2 = accessory[item[2]][0] if accessory[item[2]][1] == acc else accessory[item[2]][1]
if i >= item[0] + acc[0] + acc2[0]:
dp[i] = max(dp[i], dp[i - item[0] - acc[0] - acc2[0]] + item[1] + acc[1] + acc2[1])
print(dp[-1])
if __name__ == "__main__":
main()
这道题目是一个带有条件约束的背包问题。我们首先需要将主件和附件区分开来,并将它们的价格和重要度按要求计算。接下来,我们将使用动态规划解决这个问题。
- 将输入的物品数据分成两个部分:主件和附件。主件是附件所依赖的物品,附件是与主件相关的物品。我们用一个主件列表存储所有主件的价格、重要度乘积和索引。同时,我们使用一个二维列表存储每个主件的附件。
- 初始化一个长度为 N//10+1 的动态规划数组 dp,其中 N 为总钱数。这里我们将所有物品的价格除以 10,以简化计算。数组 dp 用于存储在不同预算下所能获得的最大满意度。
- 遍历所有主件,对于每一个主件,我们需要分别考虑以下情况:只购买主件,不购买附件。更新 dp 数组,将当前预算下的满意度与购买主件后的满意度进行比较,取较大值。购买主件和一个附件。遍历每一个附件,更新 dp 数组,将当前预算下的满意度与购买主件及附件后的满意度进行比较,取较大值。购买主件和两个附件。遍历所有附件组合,更新 dp 数组,将当前预算下的满意度与购买主件及两个附件后的满意度进行比较,取较大值。
- 最后,dp 数组的最后一个元素就是我们要求的最大满意度。
通过这个思路,我们可以解决这个带有条件约束的背包问题。
#23届找工作求助阵地##题库##编程题#
查看8道真题和解析