#include<bits/stdc++.h>
using namespace std;
int dp[10005];
int data77[505][3];
int data88[5050][2];
int maxhh(int x,int y)
{
if(x>=y)return x;
else return y;
}
int main()
{
int n,m,C,i,j,t,cnt;
scanf("%d",&C);
while(C--)
{
memset(dp,0,sizeof(dp));//不要忘记初始化dp数组哦,测试程序也要测试多组输入情况下的边界条件
//dp[0]=0;
scanf("%d %d",&m,&n);
j=1;//初始化j
for(i=1;i<=n;i++)
{
scanf("%d %d %d",&data77[i][0],&data77[i][1],&data77[i][2]);
//多重背包问题,利用2进制,转化为01背包问题
t=1;
while(data77[i][2]>=t)
{
data88[j][0]=data77[i][0]*t;
data88[j++][1]=data77[i][1]*t;
data77[i][2]-=t;t<<=1;
}
if(data77[i][2])
{
data88[j][0]=data77[i][0]*data77[i][2];
data88[j++][1]=data77[i][1]*data77[i][2];
}
}//转化为01背包问题
cnt=j-1;//记录总共转化成了几种物品
for(i=0;i<=cnt;i++)//i代表考虑几种物品
{
for(j=m;j>=data88[i][0];j--)//j代表花多少钱 ,01背包一维数组,后向前遍历
{
dp[j]=maxhh(dp[j],dp[j-data88[i][0]]+data88[i][1]);
}
}
printf("%d\n",dp[m]);
}
return 0;
}
总结
1不要忘记初始化dp数组哦,测试程序也要测试多组输入情况下的边界条件