제출 #1089523

#제출 시각아이디문제언어결과실행 시간메모리
1089523vjudge1Knapsack (NOI18_knapsack)C++14
100 / 100
180 ms9176 KiB
#include<bits/stdc++.h> #define int long long using namespace std; const int maxn = 2e3 + 5, mod = 1e9 + 7; int n, m; int dp[maxn]; vector<array<int, 2>> a; vector<pair<int,int>> b[maxn]; signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); // freopen("test.inp", "r", stdin); // freopen("test.out", "w", stdout); cin >> m >> n; for (int i = 1; i <= n; i++) { int val, w, num; cin >> val >> w >> num; b[w].emplace_back(val, num); } for (int i = 1; i <= m; i++) { int lim = m; sort(b[i].begin(), b[i].end(), greater<>()); for (auto p : b[i]) { int val, num; tie(val, num) = p; num = min(num, lim / i); int cur = 1; while (num >= cur) { a.push_back({val * cur, i * cur}); num -= cur; lim -= cur; cur *= 2; } if (num) a.push_back({val * num, i * num}), lim -= num; } } memset(dp, -0x3f, sizeof dp); int oo = dp[0]; dp[0] = 0; for (auto p : a) { int u = p[0], v = p[1]; for (int i = m; i >= v; i--) if (dp[i - v] != oo) dp[i] = max(dp[i], dp[i - v] + u); } cout << *max_element(dp, dp + m + 1); }
#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...