1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; const int MAXn = 100; const int MAXW = 40000;
int n, W; int v_new[MAXn * 10 + 10]; int w_new[MAXn * 10 + 10]; int num_new; int d[MAXW + 10];
inline int read() { register char c; for (c = getchar(); (c < '0' || c>'9') && c != '-'; c = getchar()); register bool f = c == '-'; register int s = f ? 0 : c - '0'; for (c = getchar(); c >= '0' && c <= '9'; c = getchar())s = (s << 3) + (s << 1) + c - '0'; return f ? -s : s; }
void bin_divide(int v, int w, int num, int v_new[], int w_new[], int& num_new) { for (int i = 1; num >= i; i <<= 1) { v_new[++num_new] = v * i; w_new[num_new] = w * i; num -= i; } if (num > 0) { v_new[++num_new] = v * num; w_new[num_new] = w * num; } }
void rec(int v[], int w[], int W, int num) { for (int i = 1; i <= num; i++) { for (int j = W; j >= w[i]; j--) d[j] = max(d[j], d[j - w[i]] + v[i]); } }
int eva_maxV(int d[], int W) { int ans = -INF; for (int i = 0; i <= W; i++) ans = max(ans, d[i]); return ans; }
int main() { n = read(); W = read(); int v, w, num; for (int i = 1; i <= n; i++) { v = read(); w = read(); num = read(); bin_divide(v, w, num, v_new, w_new, num_new); } rec(v_new, w_new, W, num_new); cout << eva_maxV(d, W); }
|