杭电2191----悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
1 //典型的多重背包 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 int d[1005]; 6 int n,m; 7 void zb(int r,int v) 8 { 9 for(int i = n; i >= r; --i) 10 if(d[i-r] + v > d[i]) 11 d[i] = d[i-r] + v; 12 } 13 void cb(int r,int v) 14 { 15 for(int i = r; i <= n; ++i) 16 if(d[i-r] + v > d[i]) 17 d[i] = d[i-r] + v; 18 } 19 void mb(int r,int v,int t) 20 { 21 if(t*r >= n) cb(r,v); 22 else 23 { 24 for(int i = 1; i < t; i<<=1) 25 { 26 zb(i*r,i*v); 27 t -= i; 28 } 29 zb(t*r,t*v); 30 } 31 } 32 int main() 33 { 34 int t; 35 cin >> t; 36 while(t--) 37 { 38 memset(d,0,sizeof d); 39 cin >> n >> m; 40 while(m--) 41 { 42 int a,b,c; 43 cin >> a >> b >> c; 44 mb(a,b,c); 45 } 46 cout << d[n] << endl; 47 } 48 return 0; 49 }