Submission #1255867

#TimeUsernameProblemLanguageResultExecution timeMemory
1255867dxfKnapsack (NOI18_knapsack)C++17
73 / 100
43 ms6724 KiB
#include <bits/stdc++.h>


#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

typedef long long ll;
#define change_io() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define el endl
#define all(x) begin(x), end(x)
#define pb push_back
#define mp make_pair
#define INF 1000000005
#define LLINF 1e18
#define MOD 1000000007
#define MOD9 998244353

// remove single val from multiset with -> os.find_by_order(os.order_of_key(x))
typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
typedef tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_multiset;
typedef tree<pair<ll, ll>, null_type, less<pair<ll, ll>>, rb_tree_tag, tree_order_statistics_node_update> ordered_pair_set;

const ll N5 = 1e5 + 5;
const ll N6 = 1e6 + 5;
const ll NN5=2e5+5;
const ll N3=1e3+5;
ll dp[2005] {};


void solve()
{
    int s, n; cin >> s >> n;

    map<ll, set<array<ll, 2>>> items;
    for (int i = 0; i < n; ++i) {
        ll w,v,k; cin >> v >> w >>k;
        items[w].insert({-1*v, k});
    }

    for (int i = 1; i <= s; ++i) {
        if (items[i].empty()) continue;
        ll considered = 0;
        while (!items[i].empty() && considered < s/i) {
            auto num = (*items[i].begin());
            items[i].erase(items[i].begin());
            if (num[1] != 1) {
                items[i].insert({num[0], num[1]-1});
            }

            for (int j = s; j >= i; --j) {
                dp[j] = max(dp[j], dp[j-i]-num[0]);
            }
            considered++;
        }
    }

    ll ans = 0;
    for (int i = 0; i <= s; ++i) {
        ans = max(ans, dp[i]);
    }

    cout << ans << el;
}

int main()
{
	//freopen("problemname.in", "r", stdin);
	//freopen("problemname.out", "w", stdout);
    change_io();

    ll T;
    T=1;
    //cin>>T;
    while (T--)
    {
            solve();
    }
    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...