一、题目
二、示例
三、代码
N, m = map(int, input().split())
primary, annex = {}, {}
for i in range(1, m+1): # 输入
v, p, q = map(int, input().split())
if q == 0:
primary[i] = [v, p]
else:
if q in annex:
annex[q].append([v, p])
else:
annex[q] = [[v, p]]
dp = [0] * (N + 1)
for key in primary:
w, v= [], []
w.append(primary[key][0])#主件
v.append(primary[key][0] * primary[key][1])
if key in annex:#存在附件
w.append(w[0] + annex[key][0][0])#主件+附件1
v.append(v[0] + annex[key][0][0] * annex[key][0][1])
if len(annex[key])>1:#附件个数为2
w.append(w[0] + annex[key][1][0])#主件+附件2
v.append(v[0] + annex[key][1][0]*annex[key][1][1])
w.append(w[0] + annex[key][0][0] + annex[key][1][0])#主件+附件1+附件2
v.append(v[0] + annex[key][0][0]*annex[key][0][1] + annex[key][1][0]*annex[key][1][1])
for j in range(N,-1,-10):#物品的价格是10的整数倍
for k in range(len(w)):
if j-w[k]>=0:
dp[j] = max(dp[j], dp[j-w[k]]+v[k])
print(dp[N])
四、算法说明
考虑每个物品的每种可能出现的情况:只有主件,主件+附件1,主件+附件2,主件+附件1+附件2,然后记录其对应的价值,最后采用动态规划,找到最大的值,打印输出。
胡萝卜
我不知道将去向何方,但我已在路上! |
---|
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! |