牛客_华为_HJ16 购物单

HJ16 购物单
在这里插入图片描述
在这里插入图片描述

## total  是总的价钱
## k 是物品数
total,k = list(map(int,input().split()))
total //=10
## 价值
W = {}
## 满意度
V = {}
## 记录主件物品编号  也可以统计主见物品个数
main_key = []
## 题目中的主物品编号是从1开始计算的
for i in range(1,k+1):
    ## 分别存储主物品i 对应的主物品价值  附件1价值  附件2 价值
    W[i] = [0,0,0]
    ## 分别存储主物品i 对应的主物品满意度  附件1满意度   附件2满意度 
    V[i] = [0,0,0]

for i in range(k):
    v,p,q = list(map(int,input().split()))
    
    if q==0:#这是主物品
        W[i+1][0] = v//10
        V[i+1][0] = v*p//10
        main_key.append(i+1)
    else:## 这就是附件
        if W[q][1]==0:## 如果附件1的价值为0   那么就是新的附件   否则就要放到附件二中
            W[q][1] = v//10
            V[q][1] = v*p//10
        else:## 主件中的附件2
            W[q][2] = v//10
            V[q][2] = v*p//10

# print(W,V)
#W {1: [80, 40, 30], 2: [0, 0, 0], 3: [0, 0, 0], 4: [40, 0, 0], 5: [50, 0, 0]} 
#V {1: [160, 200, 150], 2: [0, 0, 0], 3: [0, 0, 0], 4: [120, 0, 0], 5: [100, 0, 0]}
## 这里只要拿到主物品记录就可以 因为主物品中已经记录了所有信息
W_lst = []
V_lst = []
for key in main_key:
    W_lst.append(W[key])
    V_lst.append(V[key])
# print(W_lst,V_lst)
#[[80, 40, 30], [40, 0, 0], [50, 0, 0]] 
#[[160, 200, 150], [120, 0, 0], [100, 0, 0]]
## 到此正式转换为0-1 背包问题!!!!
# # 这就是物品数量    背包重量就是total   钱数
m = len(W_lst)
dp = [[0 for j in range(total +1)] for i in range(m+1)]
## dp[i][j] 表示j 背包在i中选择物品能达到的最大满意度
## 对于物品来说
## 1.不放主件  2.只放主件  3. 主+fu1  4 主+fu2   5 主+fu1+fu2

## 外层遍历主物品  附件是后面的判断加上的 
for i in range(1,m+1):
    ## price main  fu1 fu2
    w1,w2,w3 = W_lst[i-1][0],W_lst[i-1][1],W_lst[i-1][2]
    ## per main fu1 fu2
    v1,v2,v3 = V_lst[i-1][0],V_lst[i-1][1],V_lst[i-1][2]
    for j in range(1,total+1):
        # 1 不放主件
        dp[i][j] = dp[i-1][j]
        # 2 只放主
        if j>=w1:
            dp[i][j] = max(dp[i][j],dp[i-1][j-w1]+v1)
        # 3 放主+fu1
        if j>=w1+w2:
            dp[i][j] = max(dp[i][j],dp[i-1][j-w1-w2]+v1+v2)
        # 4 放主+fu2
        if j>=w1+w3:
            dp[i][j] = max(dp[i][j],dp[i-1][j-w1-w3]+v1+v3)
        # 5 放主+f1+fu2
        if j>=w1+w2+w3:
            dp[i][j] = max(dp[i][j],dp[i-1][j-w1-w2-w3]+v1+v2+v3)

print(dp[m][total]*10)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值