多重背包,先前一直不过,想回去睡觉。刚修改了一下用移位运算进行二进制模拟,没想到就过了。
#include <stdio.h>
#include <string.h>
void OneZero(int V,int cost,int value,int *dp){
for(int j = V;j>=cost;--j){
if(dp[j] < dp[j - cost] + value){
dp[j] = dp[j - cost] + value;
}
}
return ;
}
int main(int argc, char *argv[])
{
//FILE *fp;
//fp = freopen("in1.txt","r",stdin);
int t,N,M,each_v[110],value[110],cost[110],num[110],dp[110];
scanf("%d",&t);
while(t--){
scanf("%d%d",&N,&M);
for(int i = 0;i<M;++i){
scanf("%d%d%d",&cost[i],&value[i],&num[i]);
}
memset(dp,0,sizeof(dp));
for(int i = 0;i<M;++i){
//int temp = 1;
int j = 0;
int k = 1;
for(;k < num[i];++j){
OneZero(N,k*cost[i],k*value[i],dp);
num[i] -= k;
k <<= 1;
}
OneZero(N,num[i]*cost[i],num[i]*value[i],dp);
}
printf("%d\n",dp[N]);
}
return 0;
}