题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
money, number = list(map(int, input().strip().split())) money = money // 10 main = [[[0, 0], [0, 0], [0, 0]] for _ in range(number + 2)] for i in range(1, 1 + number): v, p, q = list(map(int, input().strip().split())) if q == 0: # 主件 main[i][0] = [v // 10, v * p] else: if main[q][1][0] == 0: main[q][1] = [v // 10, v * p] else: main[q][2] = [v // 10, v * p] main = [i for i in main if i[0][0] != 0] dp = [[0 for i in range(1 + money)] for j in range(1 + len(main))] for num in range(1, 1 + len(main)): for mon in range(1 + money): dp[num][mon] = dp[num - 1][mon] (p1, v1), (p2, v2), (p3, v3) = main[num - 1] # 不买前一个物品买这个物品和不买这个物品的最大值 if mon >= p1: dp[num][mon] = max(dp[num][mon], dp[num - 1][mon - p1] + v1) if mon >= p1 + p2: dp[num][mon] = max(dp[num][mon], dp[num - 1][mon - p1 - p2] + v1 + v2) if mon >= p1 + p3: dp[num][mon] = max(dp[num][mon], dp[num - 1][mon - p1 - p3] + v1 + v3) if mon >= p1 + p2 + p3: dp[num][mon] = max(dp[num][mon], dp[num - 1][mon - p1 - p2 - p3] + v1 + v2 + v3) print(dp[-1][-1])