多重背包,先前一直不过,想回去睡觉。刚修改了一下用移位运算进行二进制模拟,没想到就过了。
#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; }