题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
import sys input = sys.stdin.read def max_satisfaction(N, m, items): dp = [0] * (N + 1) main_items = [] attachments = [[] for _ in range(m + 1)] for index, (v, p, q) in enumerate(items): if q == 0: main_items.append((v, p, index + 1)) else: attachments[q].append((v, p)) for v, p, index in main_items: # 反向遍历保证dp数组的正确更新 for j in range(N, v - 1, -1): # 只买主件 dp[j] = max(dp[j], dp[j - v] + v * p) # 穷举所有附件组合 for num in range(1, 1 << len(attachments[index])): # 1 << len(attachments[index]) is 2^len(attachments[index]) total_v = v total_p = v * p for k in range(len(attachments[index])): if num & (1 << k): # 检查第k个附件是否被选择 av, ap = attachments[index][k] total_v += av total_p += av * ap if j >= total_v: dp[j] = max(dp[j], dp[j - total_v] + total_p) return max(dp) def process_input(input_data): # 解析输入 data = input_data.split() N = int(data[0]) m = int(data[1]) items = [] index = 2 for _ in range(m): v = int(data[index]) p = int(data[index+1]) q = int(data[index+2]) items.append((v, p, q)) index += 3 # 获得最大满意度 result = max_satisfaction(N, m, items) print(result) # 读取输入并处理 if __name__ == "__main__": input_data = input() process_input(input_data)