题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

n,m=map(int,input().split())
primary={}
for i in range(1,m+1):
    v,p,q=map(int,input().split())
    if q==0 and i not in primary:
        primary[i]=[[v,p]]
    elif q!=0 and q not in primary:
        primary[q]=[[0,0]]
        primary[q].append([v,p] )
    elif  q!=0 and q in primary:
            primary[q].append([v,p] ) 
    else:
         primary[i][0]=[v,p]



m=len(primary)
v=[[]]
w=[[]]
for key in primary:
    v_temp=[primary[key][0][0]]
    w_temp=[primary[key][0][0]*primary[key][0][1]]
    if len(primary[key])>1:
        v_temp.append(primary[key][1][0]+primary[key][0][0])
        w_temp.append(primary[key][1][0]*primary[key][1][1]+primary[key][0][0]*primary[key][0][1])
    #注意一个主件,两个附件时,有单主件,主件+附件1,主件+附件2,主键+附件1和2
    if len(primary[key])==3:
        v_temp.append(primary[key][0][0]+primary[key][2][0])
        v_temp.append(primary[key][1][0]+primary[key][0][0]+primary[key][2][0])
        w_temp.append(primary[key][0][0]*primary[key][0][1]+primary[key][2][0]*primary[key][2][1])
        w_temp.append(primary[key][1][0]*primary[key][1][1]+primary[key][0][0]*primary[key][0][1]+primary[key][2][0]*primary[key][2][1])
    v.append(v_temp)
    w.append(w_temp)

#简言之,即先对一个主件几种组合求max,再进入动态规划
dp=[[0]*(n+1) for _ in range(m+1)]
for i in range(1,m+1):
    for j in range(10,n+10,10):
        max_i=dp[i-1][j]
        for k in range(len(v[i])):
             if j-v[i][k]>=0:
                max_i=max(max_i,dp[i-1][j-v[i][k]]+w[i][k])
        dp[i][j]=max_i

print(dp[m][n])

全部评论

相关推荐

点赞 评论 收藏
分享
10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务