import sys budget,s = map(int,input().split()) desk = [list(map(int,line.split())) for line in sys.stdin] # 构建新列表,取附件的情况 primary={} # 表结构 # primary={priv_index:[sub1,sub2]} for i in range(s): priIndex = desk[i][2]-1 if priIndex ==-1: # 主键 primary[i] = primary.get(i,[]) # 如果i不在primary中,增加 else: # 说明是附件 primary[priIndex] = primary.get(priIndex,[]) + [i] # 构建新列表,区分有附件的和没有附件的情况 nosub = [] hassub = [] for i in primary.keys(): if primary[i] ==[]: nosub.append(i) else: hassub.append(i) fullgoods = nosub+hassub # 构建dp数组, k = 10 # 先考虑简单情况,再算能被100等更大的数整除的情况 m = int(budget/k) n = len(fullgoods) dp = [[0]*(m+1) for _ in range(n+1)] def primary_and_sub_list(i:int): # 逻辑是每个物品返回 # 输入物品的index # 用于返回一个有附件物品的情况组合列表 # 当前物品含有附件,分四种情况 # 1.只有主件 # 2.主件+附件1 # 3.主件+附件2 # 4.主件+ 附件1+附件2 # 取几种情况的最大值 # now = desk[i] price0,value0 = desk[i][0],desk[i][0]*desk[i][1] subgoods = [desk[j] for j in primary[i]] value = [value0] price = [price0] while subgoods: k = subgoods.pop() price.append(k[0]+price0) value.append(k[0]*k[1]+value0) for u in subgoods: price.append(u[0]+k[0]+price0) value.append(u[0]*u[1]+k[0]*k[1]+value0) #print(price,value) return price,value # 填表: for i in range(1,n+1): for j in range(1,m+1):# 每次多k元 goodIndexi = fullgoods[i-1]# dp列表多了0行 if goodIndexi in hassub: pricelist,valuelist = primary_and_sub_list(goodIndexi) solution = [dp[i-1][j]] for pricei,valuei in zip(pricelist,valuelist): if pricei <= j*k: # 能放下 addthis = dp[i-1][j-int(pricei/k)]+valuei # 放此物品 # notadd = dp[i-1][j] # 不放 solution.append(addthis) dp[i][j]=max(solution) else: # 不含附件 pricei = desk[goodIndexi][0] value = desk[goodIndexi][0]*desk[goodIndexi][1] if pricei <= j*k: # 能放下 addthis = dp[i-1][j-int(pricei/k)]+value # 放此物品 notadd = dp[i-1][j] # 不放 dp[i][j] = max(addthis,notadd) else: # 不能放下 dp[i][j]=dp[i-1][j] print(dp[-1][-1])