题解 | #购物单#
购物单
https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4
n ,m =map(int,input().split()) #获取输入的两个数转化为int再赋值 primary,accessory ={},{} for i in range(1,m+1) : x,y,z = map(int,input().split()) if z==0: primary[i]=[x,y]#获取主件编号为i的物品对应的价格和重要度 else: if z in accessory : accessory[z].append([x,y])#获取附件对应的主键编号Z,并加入主件编号Z对应的附件表中,当然如果存在附件就在键对应值上新增,如果不存在则下一行代码中直接新增键值对 else : accessory[z]=[[x,y]] price = [0]*(n+1) #定义一个价格对应满意集合,price[100]表示100元能够对应的最大满意度,考虑0开始股设置n+1个数 for key in primary.keys(): #此循环能起一个每一类商品只买一次的逻辑 w ,v =[],[] w.append(primary[key][0]) #将此次主件表中产品价格新增到列表M中 v.append(primary[key][0]*primary[key][1])#将此次主件表中产品满意度新增到列表v中 if key in accessory: #表示此主键表中存在附件则将相应的产品价格和满意度加入列表 w.append(w[0]+accessory[key][0][0]) # m[1],v[1]表示 主件+第一个附件集合 v.append(v[0]+accessory[key][0][0]*accessory[key][0][1]) if len(accessory[key])>1:#存在第二个附件,m[2],v[2]表示 主件+第二个附件集合 w.append(w[0]+accessory[key][1][0]) v.append(v[0]+accessory[key][1][0]*accessory[key][1][1]) w.append(w[1]+w[2]-w[0]) #m[3],v[3]表示 主件+二个附件集合 v.append(v[1]+v[2]-v[0]) # (主件+第一附件) +(主件+第二附件)-主件 =主件+二个附件 for j in range(n,9,-10) :#将总金额重大到小(考虑效率10为步长)开始遍历,保障查询相同满意度的时候价格取最低,并逐渐更新固定价格对应的满意度 for k in range(len(w)): if j-w[k]>=0: #买了price[j]产品钱还够或还有剩余则往下走,否则跳出流程 price[j]=max(price[j],price[j-w[k]]+v[k]) # 核心思想更新价格对应的满意度,此代码表示 step1:使用m[k]获取v[k]的满意度,step2:取读取剩余price[j-m[k]]元前对应的满意度 step3:将step1+step2相加 ,step4:获取价格j元step3计算的值和价格j元历史得到的值作比较,更新价格j元对应的满意度 print(price[n])
代码详细以贴出,记录调试过程中的错误记录
1.获取代码存在第二个附件的判断 ,if len(accessory[key])>1,之前写的是if len(accessory)>1,导致一直无法获取报错
2.for j in range(n,9,-10) 将总金额遍历,之前出差for j in range(n,9,10) 步长数值为10导致一运行数组越界
3.for ,if都判断语句中 语句体,需要按照对应"tab"键位置,此类出错概率很大