n, m = map(int, input().split()) #n表示钱,m表示数量 v = [0] * (m + 1) w = [0] * (m + 1) q = [0] * (m + 1) #这三个里面是列表[0],[0],[0],[0],[0],[0],[0](m+1个) for i in range(1, m + 1): v[i], w[i], q[i] = map(int, input().split()) #输入每个商品的价格,重要度,和从属关系 goods = [[] for _ in range(m + 1)] #创建从属关系列表 for i in range(1, m + 1): if q[i] != 0: goods[q[i]].append(i) #将有从属关系的表示i的附件的加入gppds[i]中 dp = [0] * (n + 1) for i in range(1, m + 1): if q[i] == 0: #主件 options = [] #购买选择列表,其中每一项是由(购买的价格,满意度)组成 cost = v[i] value = v[i] * w[i] options.append((cost, value)) #只买主件的花费和价格加入购买选择列表 attachments = goods[i] #这里是主件的附件列表 if len(attachments) >= 1: a = attachments[0] options.append((v[i] + v[a], v[i] * w[i] + v[a] * w[a])) #如果有一个以上附件,先加入一种选择,如果购买主键和附件1,将这种选择加入选择列表 if len(attachments) >= 2: b = attachments[1] options.append((v[i] + v[b], v[i] * w[i] + v[b] * w[b]))#如果有两个附件,这是主键和附件的选择 a = attachments[0] options.append( (v[i] + v[a] + v[b], v[i] * w[i] + v[a] * w[a] + v[b] * w[b]) ) #这是主键和同时购买附件1,2的选择的价格和满意度 for j in range(n, 0, -1): for c, val in options: if j >= c: dp[j] = max(dp[j], dp[j - c] + val) #z这一段是背包问题的最优解计算方法,不懂可以搜索 背包问题 print(dp[n])
思路见代码注释!
本题比较难,加油!