分組揹包問題
#include <stdio.h>
#include <vector>
using namespace std;
#include <memory.h>
#include <algorithm>
int p,n;
int dp[120][1200];
struct Item {
int energy;
int award;
};
int get_max(int a, int b) {
if (a>b)
return a;
else
return b;
}
vector<Item> items[120];
void packet_dp() {
int i,j,k;
memset(dp,0,sizeof(dp));
for (i=0;i<n;i++) {
if (items[i].size()==0)
continue;
for (j=p;j>=0;j--) {
if (i>0)
dp[i][j]=dp[i-1][j];
for (k=0;k<items[i].size();k++) {
if (j>=items[i][k].energy) {
if (i>0)
dp[i][j]=get_max(dp[i][j], dp[i-1][j-items[i][k].energy]+items[i][k].award);
else
dp[i][j]=get_max(dp[i][j], dp[i][j-items[i][k].energy]+items[i][k].award);
}
}
}
}
}
int main() {
int t,i;
int d,e,m;
Item tmp;
int result;
scanf("%d",&t);
while (t--) {
for (i=0;i<120;i++)
items[i].clear();
scanf("%d%d",&p,&n);
for (i=0;i<n;i++) {
scanf("%d%d%d",&d,&e,&m);
tmp.energy=e;
tmp.award=m;
items[d].push_back(tmp);
}
packet_dp();
result=0;
for(i=0;i<120;i++) {
if (dp[i][p]>result)
result=dp[i][p];
}
printf("%d\n", result);
}
return 0;
}