题解 | #购物单#

购物单

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))




全部评论

相关推荐

起名字真难233:人家只有找猴子的预算,来个齐天大圣他们驾驭不住呀😂😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务