Submission #1244910

#TimeUsernameProblemLanguageResultExecution timeMemory
1244910youssef97_Knapsack (NOI18_knapsack)C++20
100 / 100
71 ms33268 KiB
#include <bits/stdc++.h> using namespace std; void shawerma() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #ifdef frenchfries freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout); #endif //freopen("PROBLEMNAME.in", "r", stdin); } #define fi first #define se second #define yes cout << "YES\n"; #define no cout << "NO\n"; #define eb emplace_back #define pb push_back #define popb pop_back #define popf pop_front #define pf push_front #define all(x) (x).begin(), (x).end() #define allr(x) (x).rbegin(), (x).rend() #define vi vector<int> #define vll vector<long long> #define vpii vector<pair<int, int>> #define vpll vector<pair<long long, long long>> #define vs vector<string> #define vb vector<bool> #define vc vector<char> #define vvb vector<vector<bool>> #define vvc vector<vector<char>> #define vvi vector<vector<int>> #define vvll vector<vector<long long>> #define Ones(n) __builtin_popcount(n) typedef long double ld; typedef long long int lli; typedef long long ll; typedef pair<int, int> pii; typedef pair<long long, long long> pll; int dx[] = {0, 0, -1, 1, -1, 1, -1, 1}; int dy[] = {-1, 1, 0, 0, 1, 1, -1, -1}; char di[] = {'L', 'R', 'U', 'D'}; int kx[] = {-2, -1, 1, 2, 2, 1, -1, -2}; int ky[] = {1, 2, 2, 1, -1, -2, -2, -1}; const ll MOD = 1e9 + 7; const ll N = 1e5 + 5, M = 2e5 + 5, INF = 1e18; const ld PI = acos(-1); void Solve() { int balance, n; cin >> balance >> n; map<int, vpii> mp; for (int i = 0; i < n; ++i) { int val, sz; ll k; cin >> val >> sz >> k; if (sz <= balance && k > 0) mp[sz].pb({val, k}); } vvll dp(mp.size() + 1, vll(balance + 1, -INF)); dp[0][0] = 0; int at = 1; for (auto &[w, items]: mp) { sort(allr(items)); for (int lim = 0; lim <= balance; ++lim) { // option 1 : leave it dp[at][lim] = dp[at - 1][lim]; //option 2: take it int copies = 0, type_at = 0, used = 0; ll profit = 0; while ((copies + 1) * w <= lim && type_at < items.size()) { copies++; profit += items[type_at].fi; // check if past was seen before to maximize either now, or then but with current's value increase? if (dp[at - 1][lim - copies * w] != -INF) { dp[at][lim] = max(dp[at][lim], dp[at - 1][lim - copies * w] + profit); } used++; if(used == items[type_at].se){ used = 0; type_at++; } } } at++; } cout << *max_element(all(dp.back())) << '\n'; } int main() { shawerma(); int t = 1; //cin >> t; while (t--) { Solve(); } }
#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...