Submission #699557

#TimeUsernameProblemLanguageResultExecution timeMemory
699557tmarcinkeviciusKnapsack (NOI18_knapsack)C++14
100 / 100
206 ms247656 KiB
#include<bits/stdc++.h>
using namespace std;
#define int int64_t
typedef pair<int, int> pii;
#define f first
#define s second
#define all(a) a.begin(), a.end()
#define beg 1e18

int32_t main ()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int S, N; cin >> S >> N;

    vector<pii> item[S + 1];
    for (int i = 0; i < N; i++)
    {
        int V, W, K; cin >> V >> W >> K;
        item[W].push_back({V, K});
    }
    vector<pii> good;
    for (int i = 1; i <= S; i++)
    {
        sort(all(item[i]), greater<pii>());
        int cnt = S / i;
        int index = 0;
        while (index < item[i].size() && cnt > 0)
        {
            if (item[i][index].s == 0)
            {
                index++;
                continue;
            }
            item[i][index].s--;
            good.push_back({i, item[i][index].f});
            cnt--;
        }
    }
    // for (pii p : good)
    // {
    //     cout << "{" << p.f << " " << p.s << "}" << '\n';
    // }
    int dp[good.size() + 1][S + 1];
    //dp[0][0] = 0;
    for (int i = 0; i <= S; i++)
    {
        dp[0][i] = 0;
    }
    for (int i = 1; i <= good.size(); i++)
    {
        for (int j = 0; j <= S; j++)
        {
            if (j > 0)
            {
                //cout << "(" << dp[i][j - 1] << ")\n";
                dp[i][j] = dp[i][j - 1];
            }
            else dp[i][j] = 0;
            if (j < good[i - 1].f)
            {
                dp[i][j] = max(dp[i][j], dp[i - 1][j]);
            }
            else  dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - good[i - 1].f] + good[i - 1].s);
            // if (dp[i][j] < -1e9) cout << "-  ";
            // else
            // {
            //     cout << dp[i][j] << " ";
            //     if (dp[i][j] < 10) cout << " ";
            // }
        }
        //cout << '\n';
    }
    cout << dp[good.size()][S];
}

Compilation message (stderr)

knapsack.cpp: In function 'int32_t main()':
knapsack.cpp:28:22: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::pair<long int, long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |         while (index < item[i].size() && cnt > 0)
      |                ~~~~~~^~~~~~~~~~~~~~~~
knapsack.cpp:50:23: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::pair<long int, long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for (int i = 1; i <= good.size(); i++)
      |                     ~~^~~~~~~~~~~~~~
#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...