제출 #1150364

#제출 시각아이디문제언어결과실행 시간메모리
1150364duyphKnapsack (NOI18_knapsack)C++20
17 / 100
2 ms328 KiB
#include<bits/stdc++.h> using namespace std; int main() { cin.tie(nullptr)->sync_with_stdio(0); // freopen("a.in", "r", stdin); // freopen("a.out", "w", stdout); int S, n; cin >> S >> n; // (w, v, k) vector<array<int, 3>> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i][1] >> a[i][0] >> a[i][2]; } sort(a.begin() + 1, a.end(), [](auto u, auto v) -> bool { return u[0] == v[0] ? u[1] > v[1] : u[0] < v[0]; }); vector<array<int, 3>> b(1); int cnt = 0, sum = 0, pre = -1; for (int i = 1, j = 1; i <= n; i++) { j = i; if (a[i][0] != pre) cnt = 0; pre = a[i][0]; sum = 0; while (j <= n && a[j][0] == a[i][0] && a[j][1] == a[i][1]) cnt += a[j][2], sum += a[j][2], j++; j--; b.push_back({a[i][0], a[i][1], min(sum, S / a[i][0])}); if (cnt < S / a[i][0]) { i = j; continue; } while (j <= n && a[j][0] == a[i][0]) j++; i = j - 1; } int m = b.size() - 1; vector<int> dp(S + 1, -2e9); dp[0] = 0; for (int i = 1; i <= m; i++) { for (int k = 1; k <= b[i][2]; k++) { for (int j = S; j >= k * b[i][0]; j--) { dp[j] = max(dp[j], dp[j - k * b[i][0]] + b[i][1]); } } } cout << *max_element(dp.begin(), dp.end()); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...