#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std;int n,m; int dp[100010];int w[100010],v[100010],num[100010]; void n_pack(int weight,int value)//普通01背包的做法 { for(int i=m;i>=weight;i--) dp[i]=max(dp[i],dp[i-weight]+value); } void w_pack(int weight,int value)//完全背包的做法 { for(int i=weight;i<=m;i++) dp[i]=max(dp[i],dp[i-weight]+value); } int main() { int t;scanf("%d",&t); while(t--) {memset(dp,0,sizeof(dp)); cin>>m>>n; for(int i=1;i<=n;i++) scanf("%d%d%d",&w[i],&v[i],&num[i]); for(int i=1;i<=n;i++) { if(w[i]*num[i]>m)//当一个物品的重量和数量乘积大于背包容积的时候相当于完全背包 w_pack(w[i],v[i]); else { int k=1;//(1,2,4....,3=1+2,在k==2时候其实已经 算了3(1+2); if(k<num[i]) { n_pack(k*w[i],k*v[i]); num[i]-=k; k<<=1; } n_pack(num[i]*w[i],num[i]*v[i]); } } cout<<dp[m]<<endl; } }