题解 | #购物单#

购物单

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

#coding=utf-8
if __name__=="__main__":
    budget,n_goods=[int(i) for i in input().split()]
    budget=budget//10
    prime=[] #主件
    prime_pos=[]
    prime_affi={} #主附件
    for i in range(n_goods):
        goods=[int(t) for t in input().split()]
        goods[0]//=10
        goods[1]=goods[0]*goods[1]
        if goods[2]==0:
            prime.append(goods)
            prime_pos.append(i+1)
        else:
            if goods[2] in prime_affi:
                prime_affi[goods[2]].append(goods)
            else:
                prime_affi[goods[2]]=[goods]
                
    dp=[[0]*(budget+1) for _ in range(len(prime)+1)]
    for i in range(1,len(prime)+1):
        for cmoney in range(1,budget+1):
            goods=prime[i-1]
            if goods[0]>cmoney:
                #买不起
                dp[i][cmoney]=dp[i-1][cmoney]
            else:
                maxp1=max(dp[i-1][cmoney],dp[i-1][cmoney-goods[0]]+goods[1]) #不加入i or 加入i
                if prime_pos[i-1] in prime_affi:
                    #该主件存在附件
                    affs=prime_affi[prime_pos[i-1]]
                    for af in affs:
                        if af[0]+goods[0]<=cmoney:
                            maxp1=max(maxp1,dp[i-1][cmoney-goods[0]-af[0]]+goods[1]+af[1])
                    
                    if len(affs)==2:
                        tmp=affs[0][0]+affs[1][0]+goods[0]
                        if tmp<=cmoney:
                            maxp1=max(maxp1,dp[i-1][cmoney-tmp]+affs[0][1]+affs[1][1]+goods[1])
                dp[i][cmoney]=maxp1
    print(dp[-1][-1]*10)

                
花了好多时间呜呜。好久没用Python了,一开始输出结果总不对但又检查不出错误,然后到本地IDE逐行debug,发现了Python的一个坑:x=[[0]*a]*b所生成的列表里的每个元素列表共享一个空间,所以修改x[0]的元素,其他x[i]的元素也会发生相应变化。
全部评论

相关推荐

notbeentak...:就抓,嗯抓,开不开匿名都要抓,一点坏事不让说,就对公司顶礼膜拜佩服的五体投地就对了
点赞 评论 收藏
分享
bg27强双非本,目前在学习golang后端gin框架部分,在b站找了一个轮子项目敲了一下,技术栈是gin&nbsp;+&nbsp;gorm&nbsp;+&nbsp;mysql&nbsp;+&nbsp;redis。我目前的想法是这一个月学习408和go八股以及刷算法然后在12月找个寒假实习然后大三下开始准备考研。我是考研意愿比较强烈,想问一下我是应该all&nbsp;in其中一个方向吗,我感觉我实习对我考研来说也是没什么帮助的好像。
牛客28967172...:毕业工作,考研,考公是完全不同的方向。 99%的人拼尽全力也只能把一个做好(能做好都已经是佼佼者了,比如进进大厂,考985或者考公) 如果你确定要考研可以不用学任何就业技术框架,也不用实习经验,刷题背知识点就行,但注意必须考92院校起步,因为这个年代双非硕毕业后完全不如双非本(互联网行业),可以说双非硕在互联网就业完全是负收益
投递哔哩哔哩等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务