File tree 1 file changed +25
-13
lines changed
1 file changed +25
-13
lines changed Original file line number Diff line number Diff line change @@ -7,24 +7,36 @@ int N, W;
7
7
vector<int > wss, vss;
8
8
9
9
int solve () {
10
- map<int ,int > dp;
11
- dp[0 ] = 0 ;
10
+ vector<deque<int >> v (4 );
12
11
13
- for (int i = 0 ; i < N; ++i) {
14
- auto ndp = dp;
15
- for (auto e : dp) {
16
- auto w = e.first , v = e.second ;
17
- int nw = w + wss[i];
18
- int nv = v + vss[i];
19
- if (nw > W) continue ;
20
- ndp[nw] = max (ndp[nw], nv);
12
+ v[0 ].push_back (vss[0 ]);
13
+ for (int i = 1 ; i < N; ++i) {
14
+ int dw = wss[i] - wss[0 ];
15
+ assert (dw >= 0 && dw <= 3 );
16
+ v[dw].push_back (vss[i]);
17
+ }
18
+
19
+ for (int i = 0 ; i < 4 ; ++i) {
20
+ sort (v[i].begin (), v[i].end ());
21
+ reverse (v[i].begin (), v[i].end ());
22
+ v[i].push_front (0 );
23
+ for (int j = 1 ; j < v[i].size (); ++j) {
24
+ v[i][j] += v[i][j-1 ];
21
25
}
22
- dp = ndp;
23
26
}
24
27
25
28
int ans = 0 ;
26
- for (auto e : dp) {
27
- ans = max (ans, e.second );
29
+ for (int i = 0 ; i < v[0 ].size (); ++i) {
30
+ for (int j = 0 ; j < v[1 ].size (); ++j) {
31
+ for (int k = 0 ; k < v[2 ].size (); ++k) {
32
+ for (int l = 0 ; l < v[3 ].size (); ++l) {
33
+ ll ww = ll (wss[0 ])*i + ll (wss[0 ]+1 )*j + ll (wss[0 ]+2 )*k + ll (wss[0 ]+3 )*l;
34
+ int vv = v[0 ][i] + v[1 ][j] + v[2 ][k] + v[3 ][l];
35
+ if (ww > W) continue ;
36
+ ans = max (ans, vv);
37
+ }
38
+ }
39
+ }
28
40
}
29
41
return ans;
30
42
}
You can’t perform that action at this time.
0 commit comments