Submission #1255168

#TimeUsernameProblemLanguageResultExecution timeMemory
1255168_filya_Knapsack (NOI18_knapsack)C++20
100 / 100
59 ms1660 KiB
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

// Time complexitty O(nlogn + s^2logs)

int main()
{
// 	ifstream cin("input.txt");
//     ofstream cout("output.txt");
	ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	int s, n; cin >> s >> n;
    vector<array<int, 3>> items(n);
    vector<vector<int>> items_by_w(s + 1);
    for (int i = 0; i < n; i++) {
        int v, w, k; cin >> v >> w >> k;
        items[i] = {v, w, k};
    }
    sort(items.begin(), items.end());
    reverse(items.begin(), items.end());
    vector<int> sz(s + 1, 0);
    vector<pair<int, int>> n_items(1);
    n_items.reserve(s * 11);
    for (auto it : items) {
        while(sz[it[1]] <= s / it[1] + 1 && it[2]) {
            sz[it[1]]++;
            n_items.push_back({it[0], it[1]});
            it[2]--;
        }
    }
    for (int w = 0; w <= s; w++) {
        auto v = items_by_w[w];
        for (auto u : v) n_items.push_back({u, w});
    }
    n = n_items.size();
    vector<ll> dp(s + 1, 0);
    for (int i = 1; i <= n; i++) {
        vector<ll> ndp(s + 1, 0);
        for (int cs = 0; cs <= s; cs++) {
            ndp[cs] = dp[cs];
            if (cs >= n_items[i].second) ndp[cs] = max(ndp[cs], dp[cs - n_items[i].second] + n_items[i].first);
        }
        swap(ndp, dp);
    }
    cout << dp[s] << '\n';
}
#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...