#include<bits/stdc++.h>
using namespace std;
/*
zw:主件价格,zv:主件价格*重要度
fw:主件对应附件价格(第1列是个数,第23列是第几个附件)
fv:附件价格*重要度
dp:滚动存储每种情况下每个单位价格下的最大结果
n:总价格,m:总个数
*/
int m,total;//m:件数,total:总金额
int zw[40000],zv[40000];//主件金额,主件价值(金额*重要度)
int fw[40000][4],fv[40000][3];//附件金额,附件价值
int dp[40000],v,p,q;//dp:存储在i件物品的背包容量为j的情况下的最大价值
int main(){
int i,j;
cin>>total>>m;
//循环m件物品
for(i = 1;i <= m;i++){
cin>>v>>p>>q;
//如果是主件
if(q == 0){
zw[i] = v;//价格
zv[i] = v * p;//价值度(价格*重要)
}else{
//第q个物品的附件个数
fw[q][0]++;
fw[q][fw[q][0]]=v;//第几个主件的价格
fv[q][fw[q][0]]=v*p;//附件价值(价格*重要)
}
}
//循环m个物品
for(i = 1;i <= m;i++){
//按背包的逻辑循环从总价格开始循环到每个主件的价格
for(j = total;j >= zw[i];j--){
//在能装下这个物品的情况下,讨论:只要主件,主件+附件1,主件+附件2,主件+附件12
//情况1:只要主件
dp[j] = max(dp[j],dp[j-zw[i]]+zv[i]);
//情况2:主件+附件1
if(j>=zw[i]+fw[i][1]) dp[j]=max(dp[j],dp[j-zw[i]-fw[i][1]]+zv[i]+fv[i][1]);
//情况3:主件+附件2
if(j>=zw[i]+fw[i][2]) dp[j]=max(dp[j],dp[j-zw[i]-fw[i][2]]+zv[i]+fv[i][2]);
//情况4:主件+附件12
if(j>=zw[i]+fw[i][1]+fw[i][2])
dp[j]=max(dp[j],dp[j-zw[i]-fw[i][1]-fw[i][2]]+zv[i]+fv[i][1]+fv[i][2]);
}
}
cout<<dp[total];
return 0;
}
/**************************************************************
Problem: 1820
User: admin
Language: C++
Result: Accepted
Time:68 ms
Memory:3636 kb
****************************************************************/