제출 #563122

#제출 시각아이디문제언어결과실행 시간메모리
563122HmmOkKewlKnapsack (NOI18_knapsack)C++14
100 / 100
252 ms247812 KiB
#include <bits/stdc++.h> #if ONLINE_JUDGE #define DEBUG(...) #else #define DEBUG(kek) cout << "DEBUG: [ " << #kek << " = " << kek << " ]\n" #endif typedef long long ll; typedef unsigned long long ull; typedef long double ld; #define ff first #define ss second #define vt(...) vector<__VA_ARGS__> #define sz(...) (int)(__VA_ARGS__).size() #define pii pair<int, int> #define pll pair<ll, ll> #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() constexpr int M = 1000000007; constexpr int MONKE = 0; using namespace std; template <typename T1, typename T2> ostream& operator<<(ostream& os, pair<T1, T2>& a) { os << "{" << a.first << ", " << a.second << "}"; return os; } template <typename T> ostream& operator<<(ostream& os, vector<T> container) { os << "\n[ "; for (auto x : container) os << x << " "; os << "]\n"; return os; } template <typename T1, typename T2> bool sort_by_second_greater(const pair<T1, T2>& a, const pair<T1, T2>& b) { return (a.ss > b.ss); } int main() { // unsync with C stream :) ios_base::sync_with_stdio(MONKE); cin.tie(0); // todo int S, n; cin >> S >> n; vector<tuple<int, int, int>> items(n); for (int i = 0; i < n; ++i) { int v, w, k; cin >> v >> w >> k; items[i] = {v, w, k}; } vt(vt(pii)) groups(S + 1); for (int i = 0; i < n; ++i) { int idx = get<1>(items[i]); groups[idx].pb({get<0>(items[i]), get<2>(items[i])}); } vector<int> value, weight; for (int i = 1; i <= S; ++i) sort(all(groups[i]), greater<pii>()); int validItems = 0; for (int i = 1; i <= S; ++i) { int mxItems = S / i; int taken = 0; int itmIdx = 0; while (taken < mxItems && itmIdx < sz(groups[i])) { int takes = min(mxItems - taken, groups[i][itmIdx].ss); for (int j = 0; j < takes; ++j) { value.pb(groups[i][itmIdx].ff); weight.pb(i); } taken += takes; itmIdx++; } validItems += taken; } vt(vt(long long)) maxValue(S + 1, vt(long long)(validItems, 0)); // cerr << value; // cerr << weight; for (int i = weight[0]; i <= S; ++i) maxValue[i][0] = value[0]; for (int i = 1; i <= S; ++i) { for (int j = 1; j < validItems; ++j) { maxValue[i][j] = max(maxValue[i][j - 1], (i >= weight[j] ? maxValue[i - weight[j]][j - 1] + value[j] : 0)); } } cout << maxValue[S][validItems - 1]; return MONKE; }
#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...