题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
#coding=utf-8
if __name__=="__main__":
budget,n_goods=[int(i) for i in input().split()]
budget=budget//10
prime=[] #主件
prime_pos=[]
prime_affi={} #主附件
for i in range(n_goods):
goods=[int(t) for t in input().split()]
goods[0]//=10
goods[1]=goods[0]*goods[1]
if goods[2]==0:
prime.append(goods)
prime_pos.append(i+1)
else:
if goods[2] in prime_affi:
prime_affi[goods[2]].append(goods)
else:
prime_affi[goods[2]]=[goods]
dp=[[0]*(budget+1) for _ in range(len(prime)+1)]
for i in range(1,len(prime)+1):
for cmoney in range(1,budget+1):
goods=prime[i-1]
if goods[0]>cmoney:
#买不起
dp[i][cmoney]=dp[i-1][cmoney]
else:
maxp1=max(dp[i-1][cmoney],dp[i-1][cmoney-goods[0]]+goods[1]) #不加入i or 加入i
if prime_pos[i-1] in prime_affi:
#该主件存在附件
affs=prime_affi[prime_pos[i-1]]
for af in affs:
if af[0]+goods[0]<=cmoney:
maxp1=max(maxp1,dp[i-1][cmoney-goods[0]-af[0]]+goods[1]+af[1])
if len(affs)==2:
tmp=affs[0][0]+affs[1][0]+goods[0]
if tmp<=cmoney:
maxp1=max(maxp1,dp[i-1][cmoney-tmp]+affs[0][1]+affs[1][1]+goods[1])
dp[i][cmoney]=maxp1
print(dp[-1][-1]*10)
花了好多时间呜呜。好久没用Python了,一开始输出结果总不对但又检查不出错误,然后到本地IDE逐行debug,发现了Python的一个坑:x=[[0]*a]*b所生成的列表里的每个元素列表共享一个空间,所以修改x[0]的元素,其他x[i]的元素也会发生相应变化。
