Submission #629366

#TimeUsernameProblemLanguageResultExecution timeMemory
629366finn__Knapsack (NOI18_knapsack)C++17
12 / 100
1083 ms4828 KiB
#include <bits/stdc++.h>
using namespace std;

typedef struct item item;
struct item
{
    unsigned i;
    unsigned w;
    unsigned v;
    unsigned k;
};

bool item_cmp(item a, item b)
{
    if (a.w < b.w)
        return 1;
    else if (b.w < a.w)
        return 0;
    else
    {
        if (a.v < b.v)
            return 1;
        else
            return 0;
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    unsigned s, n;
    cin >> s >> n;

    vector<item> items(n);
    for (size_t i = 0; i < n; i++)
    {
        item &x = items[i];
        cin >> x.v >> x.w >> x.k;
        x.i = i;
    }

    sort(items.begin(), items.end(), item_cmp);

    // Holds the maximum achievable value with weight i.
    vector<unsigned> dp(s + 1, 0);
    vector<map<unsigned, unsigned>> used(s + 1);

    for (size_t i = 1; i < s + 1; i++)
    {
        for (size_t j = 0; j < i; j++)
        {
            item search = {.i = 0, .w = i - j, .v = UINT_MAX, .k = 0};
            auto max_item = --upper_bound(items.begin(), items.end(), search, item_cmp);

            while (max_item != --items.begin() &&
                   used[j].find(max_item->i) != used[j].end() &&
                   used[j][max_item->i] == max_item->k)
                max_item--;

            if (max_item == --items.begin())
            {
                if (dp[j] > dp[i])
                {
                    dp[i] = dp[j];
                    used[i] = used[j];
                }
            }
            else
            {
                if (dp[j] + max_item->v > dp[i])
                {
                    dp[i] = dp[j] + max_item->v;
                    used[i] = used[j];
                    if (used[i].find(max_item->i) == used[i].end())
                        used[i][max_item->i] = 1;
                    else
                        used[i][max_item->i]++;
                }
            }
        }
    }

    cout << dp[s] << '\n';
}

Compilation message (stderr)

knapsack.cpp: In function 'int main()':
knapsack.cpp:54:43: warning: narrowing conversion of '(i - j)' from 'size_t' {aka 'long unsigned int'} to 'unsigned int' [-Wnarrowing]
   54 |             item search = {.i = 0, .w = i - j, .v = UINT_MAX, .k = 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...