题解 | 购物单

购物单

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

c, n = map(int, input().split())

m_goods = []
a_goods = []
for i in range(n):
    cost, importance, follow = map(int, input().split())
    if follow == 0:  # 主件
        m_goods.append([cost, cost * importance, follow, i + 1])
    else:  # 附件
        a_goods.append([cost, cost * importance, follow])

# print(m_goods)
# print(a_goods)
# [[10, 30, 0, 3], [10, 20, 0, 4], [10, 10, 0, 5]]
# [[20, 60, 5], [20, 60, 5]]

goods = [[] for _ in range(len(m_goods))]
for i in range(len(m_goods)):
    goods[i].append(m_goods[i])
for i in range(len(a_goods)):
    for j in range(len(m_goods)):
        if a_goods[i][2] == m_goods[j][3]:  # 找到附件的主件
            goods[j].append(a_goods[i])

# for good in goods:
#     print(good)
# [[10, 30, 0, 3]]
# [[10, 20, 0, 4]]
# [[10, 10, 0, 5], [20, 60], [20, 60]]

for i in range (len(goods)):
    goods[i][0].pop(2)
    for j in range(1,len(goods[i])):
        goods[i][j].pop(2)
    goods[i][0].pop(2)#去掉没用的数据:所属主件、物品编号


# for good in goods:
#     print(good)

for i in range (len(goods)):
    if len(goods[i])==2:
        goods[i][1]=[x+y for x,y in zip(goods[i][0],goods[i][1])]
    if len(goods[i])==3:
        goods[i].append([0,0])
        goods[i][3]=[x+y for x,y in zip(goods[i][1],goods[i][2])]
        for j in range(1,4):
            goods[i][j][0]+=goods[i][0][0]
            goods[i][j][1]+=goods[i][0][1]

# for good in goods:
#     print(good)

dp=[0 for _ in range(c+1)]
for good in goods:
    for i in range(c,-1,-1):
        for weight,value in good:
            if weight<=i and value + dp[i-weight]>dp[i]:
                dp[i]=value + dp[i-weight]

print(max(dp))










全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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