#include<bits/stdc++.h>
using namespace std;
#define MXM 110
int p[MXM],h[MXM],c[MXM],dp[MXM];
int n,m;
int main()
{
int T,i,j,k;
cin>>T;
while(T--)
{
memset(dp,0,sizeof dp);
cin>>n>>m;
for(i=1;i<=m;i++)
cin>>p[i]>>h[i]>>c[i];
for(i=1;i<=m;i++)
for(j=n;j>=0;j--)
for(k=1;k<=c[i];k++)
if(j>=p[i]*k) dp[j]=max(dp[j],dp[j-p[i]*k]+h[i]*k);
cout<<dp[n]<<'\n';
}
return 0;
}
转化为01背包问题;
空间优化:dp[MXM]采用一维数组,但j循环时要反向,避免出错(01背包问题的前提:每件物品只有一件)添加链接描述