一、描述
二、分析及解答
该题在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]