杭电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 }

 

posted @ 2017-08-02 20:34  Posase  阅读(172)  评论(0编辑  收藏  举报