题意:传送门
题解:多重背包板题
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+5;
const int maxm=1e2+5;
int C,n,m,p[maxm],h[maxm],c[maxm];
int dp[maxn];
void zeroonepack(int v,int w)
{
for(int i=n;i>=v;i--){
dp[i]=max(dp[i],dp[i-v]+w);
}
}
void completepack(int v,int w)
{
for(int i=v;i<=n;i++){
dp[i]=max(dp[i],dp[i-v]+w);
}
}
void multipack(int v,int w,int num)
{
if(v*num>=n){
completepack(v,w);
return ;
}
for(int k=1;k<=num;k<<=1){
zeroonepack(k*v,k*w);
num-=k;
}
if(num){
zeroonepack(num*v,num*w);
}
}
int main()
{
scanf("%d",&C);
while(C--){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&p[i],&h[i],&c[i]);
}
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++){
multipack(p[i],h[i],c[i]);
}
printf("%d\n",dp[n]);
}
return 0;
}