题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
import sys
import collections
import functools
n,m=map(int,input().strip().split())
v=[0]*m #价格 均默认为0
p=[0]*m #重要性
q=[0]*m #编号
d=collections.defaultdict(list) #键值为主键编号,内容为附件的编号
for i in range(m):
all=list(map(int,input().strip().split()))
v[i]=all[0] #价格
p[i]=all[1] #重要性
q[i]=all[2]-1 #编号 #注意用例,用例的编号从1开始,而我们字典的编号从0开始
if q[i] != -1:
d[q[i]].append(i)
dn=collections.defaultdict(list) #状态转移:有附件的主件+主件加一个附件+主件加两个附件+没有附件的主件
for i in d.keys():
dn[i].append(
[
v[i], #主件价格
v[i]*p[i] #满意度
]
)
for j in d[i]:
dn[i].append(
[
v[j]+v[i], #主件加上其中一个附件的价格
v[j]*p[j]+v[i]*p[i] #主件加上其中一个附件的满意度
]
)
if len(d[i])==2: #如果某个主件有两个附件
dn[i].append(
[
v[d[i][0]] + v[i] + v[d[i][1]], #主件加上两个附件的价格
v[d[i][0]]*p[d[i][0]] + v[i]*p[i] + v[d[i][1]]*p[d[i][1]] #主件加上另外两个附件的满意度
]
)
for i in range(m):
if i not in d and q[i]==-1:
dn[i].append(
[
v[i], #主件的价格
v[i]*p[i] #主件的满意度
]
)
@functools.cache
def f(i,n):
if n<0:
return 0
if i<0:
return 0
res=f(i-1,n)
for v,p in dn[k[i]]:
if v > n:
continue
res=max(res,f(i-1,n-v)+p)
return res
k=list(dn.keys()) #把状态转移出来的表,键值取出来作为一个表格
print(f(len(k)-1,n))

