제출 #674294

#제출 시각아이디문제언어결과실행 시간메모리
674294ThinGarfieldKnapsack (NOI18_knapsack)C++11
100 / 100
204 ms43096 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; #define mp make_pair #define F first #define S second constexpr int maxs = 2e3 + 5; int n, s; vector<pii> items[maxs]; // items[i] = all items (val, ct) with weight i, sort by val ll vadd[maxs][maxs]; // vadd[i][j] = value added by taking j items of weight i ll dp[maxs][maxs]; // dp[i][j] = best value from i-sized basket w/ only items of weight <= j int main() { // ios_base::sync_with_stdio(false); // cin.tie(NULL); cin >> s >> n; for (int i = 1; i <= n; i++) { int v, w, k; cin >> v >> w >> k; items[w].push_back(mp(v, k)); } for (int i = 1; i <= s; i++) { sort(items[i].rbegin(), items[i].rend()); int ct = 1; for (pii it : items[i]) { for (int j = 0; j < it.S && ct <= s / i; j++, ct++) { vadd[i][ct] = vadd[i][ct - 1] + it.F; } } // cout << i << " : "; // for (int j = 0; j <= ct; j++) { // cout << vadd[i][j] << ' '; // } // cout << '\n'; } for (int i = 1; i <= s; i++) { for (int j = 1; j <= s; j++) { dp[i][j] = dp[i][j - 1]; for (int k = 1; j * k <= i && vadd[j][k] != 0; k++) { dp[i][j] = max(dp[i][j], dp[i - j * k][j - 1] + vadd[j][k]); } // cout << dp[i][j] << ' '; } // cout << '\n'; } cout << dp[s][s] << '\n'; 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...