""" @Author: Nut @FileName: emmm.py @DateTime: 2025/8/9 16:44 @SoftWare: PyCharm """ import sys from itertools import combinations # 输入 n, m = map(int, sys.stdin.readline().strip().split()) info = [] for _ in range(m): info.append(list(map(int, sys.stdin.readline().strip().split()))) # [主件(v,w),[附件1(v,w),附件2(v,w)]] temp = [[None, []] for i in range(m)] # [[主件(v,w*v),主件+附1(v,w*v),主+附2(v,w*v),主+附1+附2(v,w*v)]] weight = [] for obj_idx in range(m): if info[obj_idx][2] == 0: temp[obj_idx][0] = (info[obj_idx][0], info[obj_idx][1]) else: temp[info[obj_idx][2] - 1][1].append((info[obj_idx][0], info[obj_idx][1])) for idx, (main, ass) in enumerate(temp): # 存在主件 if main: w = [(main[0], main[0] * main[1])] for r in range(1, len(ass) + 1): for attch in combinations(ass, r): w.append( ( main[0] + sum([v[0] for v in attch]), main[0] * main[1] + sum([v[0] * v[1] for v in attch]), ) ) weight.append(w) # 背包问题:dp[i][j]:前 i 个商品,预算为 j 时的最大价值 # dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]]) item_count = len(weight) dp = [[0] * (n + 1) for _ in range(item_count + 1)] for i in range(1, item_count + 1): # 物品 for j in range(1, n + 1): # 预算 for v, w in weight[i - 1]: if v <= j: # 选拿或不拿 dp[i][j] = max(dp[i][j], dp[i - 1][j], dp[i - 1][j - v] + w) else: # 不能拿 dp[i][j] = max(dp[i][j], dp[i - 1][j]) print(dp[item_count][n])
真吐了简直是石山下辈子再也不学计算机了