## 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)
牛客_华为_HJ16 购物单
最新推荐文章于 2023-07-17 15:25:19 发布