1 //大牛的多重背包二进制优化写法 2 #include<stdio.h> 3 #include<string.h> 4 int r[105],v[105],n[105]; 5 int a[1005]; 6 int Room; 7 8 void db(int,int,int); 9 void lb(int,int); 10 void wb(int,int); 11 12 int main() 13 { 14 int t; 15 scanf("%d",&t); 16 while(t--) 17 { 18 memset(a,0,sizeof a); 19 int num; 20 scanf("%d%d",&Room,&num); 21 for(int i=0; i<num; ++i) 22 { 23 scanf("%d%d%d",r+i,v+i,n+i); 24 db(r[i],v[i],n[i]); 25 } 26 printf("%d ",a[Room]); 27 } 28 } 29 30 void db(int r,int v,int n) 31 { 32 if(n*r >= Room) 33 { 34 wb(r,v); 35 return ; 36 } 37 int k=1; 38 while(k < n) 39 { 40 lb(k*r,k*v); 41 n-=k; 42 k*=2; 43 } 44 lb(n*r,n*v); 45 } 46 47 void lb(int r,int v) 48 { 49 for(int j=Room; j>=r; --j) 50 { 51 int t = a[j-r]+v; 52 if(a[j] < t) 53 a[j]=t; 54 } 55 } 56 57 void wb(int r,int v) 58 { 59 for(int j=r; j<=Room; ++j) 60 { 61 int t = a[j-r]+v; 62 if(a[j] < t) 63 a[j]=t; 64 } 65 }