제출 #631035

#제출 시각아이디문제언어결과실행 시간메모리
631035thienbao1602Knapsack (NOI18_knapsack)C++17
100 / 100
98 ms34312 KiB
#include    <bits/stdc++.h>
#define ll long long
using namespace std;

const ll inf = -1e15;

int S, n;

void solve()
{
    cin >> S >> n;
    map<ll, vector<pair<ll, ll>>> weight;
    for(int i=0; i<n; i++)
    {
        ll val, w, sl;
        cin >> val >> w >> sl;
        weight[w].push_back({val, sl});
    }

    vector<vector<ll>> ans((int)weight.size() + 1, vector<ll>(S+1, inf));
    ans[0][0] = 0;
    int id = 1;
    for(auto [w, items] : weight)
    {
        sort(items.begin(), items.end(), greater<pair<ll, ll>>());
        for(int i=0; i<=S; i++)
        {
            ans[id][i] = ans[id-1][i];
            ll sl = 0, profit = 0, used = 0, type_at = 0;
            while((sl+1) * w <= i && type_at < (int)items.size())
            {
                sl++;
                profit += items[type_at].first;
                if (ans[id-1][i-sl*w] != inf)
                {
                    ans[id][i] = max(ans[id][i], ans[id-1][i-sl*w] + profit);
                }

                used++;
                if (used == (ll)items[type_at].second)
                {
                    used = 0;
                    type_at++;
                }
            }
        }
        id++;
    }

    ll sol = 0;
    for(int i=0; i<=S; i++)
    {
        sol = max(sol, ans[(int)weight.size()][i]);
    }
    cout << sol;
    //cout << *max_element(ans.back().begin(), ans.back().end());
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    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...