题解 | #购物单#

购物单

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

n,m=map(int,input().split())
obj={}
base=10//因为全是10的倍数,所以把金额除以10以减少运算量
sum=int(n/base)
for i in range(1,m+1)://这里是把对应的主附件的价格及满意度保存在字典中
    x,y,z=map(int,input().split())
    if z:
        if z in obj:
            obj[z]=obj[z]
        else:
            obj[z]=[]
        obj[z].append([int(x/base),(int(x/base))*y])
    else:
        if i in obj:
            obj[i]=obj[i]
        else:
            obj[i]=[]
        obj[i].insert(0,[int(x/base),(int(x/base))*y])
lst=list(obj.values())//将字典的值转为数组
dp=[0]*(sum+1)
for i in lst://遍历lst数组
    p,v=[],[]
    p.append(i[0][0])
    v.append(i[0][1])
    if len(i)>1://如果有附件则将附件的价值及满意度加上主件的价值及满意度添加到数组中
        p.append(i[0][0]+i[1][0])
        v.append(i[0][1]+i[1][1])
    if len(i)>2://如果有两个附件则将第二个附件的价值及满意度加上主件的价值及满意度添加到数组中
        p.append(i[0][0]+i[2][0])
        v.append(i[0][1]+i[2][1])
        p.append(i[0][0]+i[1][0]+i[2][0])
        v.append(i[0][1]+i[1][1]+i[2][1])
    for j in range(sum,0,-1):
        for k in range(len(p)):
            if j>=p[k] :
                dp[j]=max(dp[j],v[k]+dp[j-p[k]])//得到价值=》最大满意度数组
print(dp[sum]*base)//返回给定价值所对应的满意度

全部评论

相关推荐

03-26 13:04
已编辑
电子科技大学 算法工程师
xiaowl:你这个简历“条目上”都比较有深度性,但是实际上面试官又没法很好的评估你是怎么达到很多看上去很厉害的结果的。要避免一些看上去很厉害的包装,比如高效的内存复用策略的表达,如果仅是简单的一些内存共享机制,而且面试上也没有深挖的空间,就不要这样表达。比如,工程化模式本质上可能就是定义了一些abstract class,那也就没特别多值得讲的内容。建议简历上应该侧重那些你花了大量时间和精力解决、研究的问题,不要过分追求“丰富”,而是关注在技术深入度、问题解决能力的表现上。
没有实习经历,还有机会进...
点赞 评论 收藏
分享
04-01 12:25
中南大学 Java
枯基Evan_:腾讯一面写过11次的题目没写出来
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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