题解:购物单(01背包问题进阶)

一、描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、分析及解答

该题在01背包基础上,额外加入主附件问题。而一个主件最多有两个附件,因此对一个有一个或两个附件的主件来说,会分别对应两种或三种情况。主件、主件搭配一个附件、主件搭配两个附件(如果有两个附件)。将新产生的搭配当作一个没有附件的主件看待即可。此时该问题转化为01背包问题。

s = input()
s = s.split()
money = int(s[0])
n = int(s[1])
contents = []
primary, adjunct = {}, {}
for i in range(1,n+1):
    s = input()
    s = s.split()
    value = int(s[0])
    weight = int(s[1])
    master = int(s[2])
    if master == 0:
        primary[i] = [value,weight]
    else:
        if master in adjunct:
            adjunct[master].append([value,weight])
        else:
            adjunct[master] = [[value,weight]]
# print(primary)
# print(adjunct) 
matrix = [0]*(money+1)
for key,value in primary.items():
    v,w = [],[]
    v.append(primary[key][0])
    w.append(primary[key][0]*primary[key][1])
    if key in adjunct:
        v.append(primary[key][0]+adjunct[key][0][0])
        w.append(w[0]+adjunct[key][0][0]*adjunct[key][0][1])
        if len(adjunct[key])>1:
            v.append(primary[key][0]+adjunct[key][1][0])
            w.append(w[0]+adjunct[key][1][0]*adjunct[key][1][1])
            v.append(primary[key][0]+adjunct[key][0][0] + adjunct[key][1][0])
            w.append(w[0]+adjunct[key][0][0]*adjunct[key][0][1] + adjunct[key][1][0]*adjunct[key][1][1])
    for j in range(money,-1,-10):
        for k in range(len(v)):
            if j>=v[k]:
                matrix[j] = max(matrix[j],matrix[j-v[k]]+w[k])
                print(matrix)
# print(matrix)
print(matrix[money])

如有问题或建议欢迎私信。
严禁私自转载,侵权必究。

参考:
[1] 购物车 [牛客网]
[2] 01背包问题详解(浅显易懂)[CSDN]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值