照着九讲的公式,也只记得这些了。。
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int p[105],h[105],c[105];
int dp[105];
int n;
void CompletePack(int p,int h)
{
for(int i=p;i<=n;i++)
dp[i]=max(dp[i],dp[i-p]+h);
}
void ZeroOnePack(int p,int h)
{
for(int i=n;i>=p;i--)
dp[i]=max(dp[i],dp[i-p]+h);
}
void MultiPack(int p,int h,int c)
{
int k;
if(p*c>=n)
{
CompletePack(p,h);
return ;
}
k=1;
while(k<c)
{
ZeroOnePack(k*p,k*h);
c-=k;
k*=2;
}
ZeroOnePack(c*p,c*h);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
int m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&p[i],&h[i],&c[i]);
for(int i=1;i<=m;i++)
MultiPack(p[i],h[i],c[i]);
printf("%d\n",dp[n]);
}
return 0;
}