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
| #include<iostream>
using namespace std;
const int N = 20010; int dp[N], a[N], b[N];
int main() { int n, v, idx = 0; scanf("%d%d", &n, &v); while (n--) { int vi, wi, si, k = 1; scanf("%d%d%d", &vi, &wi, &si); while (si >= k) { a[++idx] = k * vi; b[idx] = k * wi; si -= k; k <<= 1; } if (si > 0) { a[++idx] = si * vi; b[idx] = si * wi; } }
n = idx; for (int i = 1; i <= n; i++) for (int j = v; j >= a[i]; j--) dp[j] = max(dp[j], dp[j - a[i]] + b[i]); printf("%d\n",dp[v]); }
|