#include <iostream> using namespace std; struct attach{ int value; int priority; attach():value(0),priority(0){} attach(int v,int p):value(v),priority(p){} }; struct goods{ int value; int priority; attach obj[2]; goods():value(0),priority(0){} goods(int v,int p):value(v),priority(p){} }; int dp[32000][60]; goods shop[60]; attach obj[60][2]; /** * dp[i][j]表示在选取前j主件物品总余额为i的情况下所能获得的最大满意度 * 则dp[n][m]即为要求的最大满意度 */ int main() { int n,m,v,p,q; while (cin>>n>>m){ // 保存物品 for (int i = 1; i <= m; ++i) { cin>>v>>p>>q; if (q==0){ // 主件 shop[i] = goods(v,p); } else{ // 附件 if (obj[q][0].priority){ obj[q][1] = attach(v,p); } else{ obj[q][0] = attach(v,p); } } } // 主件加入附件 for (int i = 1; i <= m; ++i) { if (obj[i][0].priority) { shop[i].obj[0] = obj[i][0]; } if (obj[i][1].priority){ shop[i].obj[1] = obj[i][1]; } } // 动态规划 int one,two,three,surplus; for (int i = 1; i <= m; ++i) { for (int j = 10; j <= n; j = j + 10) { surplus = j - shop[i].value; if (surplus>=0){ // 单买主件余额足够 one = shop[i].value*shop[i].priority; dp[j][i] = max(dp[j][i-1],dp[surplus][i-1]+one); // 考虑加附件情况 surplus = j - (shop[i].value + shop[i].obj[0].value); if (surplus>=0){ // 主件+附件1 two = shop[i].value*shop[i].priority + shop[i].obj[0].value*shop[i].obj[0].priority; dp[j][i] = max(dp[j][i],dp[surplus][i-1]+two); } surplus = j - (shop[i].value + shop[i].obj[1].value); if (surplus>=0){ // 主件+附件2 two = shop[i].value*shop[i].priority + shop[i].obj[1].value*shop[i].obj[1].priority; dp[j][i] = max(dp[j][i],dp[surplus][i-1]+two); // 考虑加上所有附件情况 surplus = j - (shop[i].value + shop[i].obj[0].value + shop[i].obj[1].value); if (surplus>=0){ // 主件+附件1+附件2 three = shop[i].value*shop[i].priority + shop[i].obj[0].value*shop[i].obj[0].priority + shop[i].obj[1].value*shop[i].obj[1].priority; dp[j][i] = max(dp[j][i],dp[surplus][i-1]+three); } } } else{ // 购买当前物品余额不够 dp[j][i] = dp[j][i-1]; } } } cout<<dp[n][m]<<endl; } }