Submission #1350619

#TimeUsernameProblemLanguageResultExecution timeMemory
1350619cpismayilmmdv985Knapsack (NOI18_knapsack)C++20
49 / 100
2 ms344 KiB
#ifdef LOCAL
#include ".debug.hpp"
#else
#define debug(...) 42
#endif
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
using ordered_set = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>;

signed main() {
#ifndef VOID
   cin.tie(nullptr)->sync_with_stdio(false);
#endif

   int N, S;   cin >> S >> N;
   vector<vector<int>> group(S + 5);
   vector<vector<array<int, 2>>> A(S + 5);
   for (int i = 0, V, W, K; i < N; i++) {
      cin >> V >> W >> K, K = min(K, S);
      A[W].push_back({V, K});
   }
   for (int w = 1; w <= S; w++) {
      if (A[w].empty()) continue;
      sort(A[w].begin(), A[w].end(), [&](const array<int, 2> &x, const array<int, 2> &y) -> bool {
         return x[0] > y[0];
      });
      for (auto &[val, cnt] : A[w]) {
         if ((int)group[w].size() + cnt <= S)
            for (int i = 0; i < cnt; i++) group[w].push_back(val);
         else 
            for (int i = 0; i < S - (int)group[w].size(); i++) group[w].push_back(val);
      }
   }
   vector<int64_t> dp(S + 5);
   for (int w = 1; w <= S; w++)
      for (auto &v : group[w])
         for (int s = S; s >= w; s--)  dp[s] = max(dp[s], dp[s - w] + v);
   cout << *max_element(dp.begin(), dp.end());

   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...