Advertisement
Hezov

NOI18 Knapsack 100p

Apr 4th, 2025
387
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1. // https://oj.uz/problem/view/NOI18_knapsack 100p
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6. struct item{int val, cnt;};
  7. vector<item> A[2002];
  8. int dp[2001][2001];
  9. // dp[i][j] - considerand greutati pana la i care e
  10. // valoarea maxima obtinuta cu capacitatea j.
  11. bool cmp(item a, item b)
  12. {
  13.     return a.val > b.val;
  14. }
  15. int main()
  16. {
  17.     int S, N;
  18.     cin >> S >> N;
  19.     for(int i = 1;i<=N;i++)
  20.     {
  21.         int v, w, k;
  22.         cin >> v >> w >>  k;
  23.         A[w].push_back({v,k});
  24.     }
  25.     for(int i = 1;i<=S;i++)
  26.         if(!A[i].empty())
  27.             sort(A[i].begin(),A[i].end(),cmp);
  28.  
  29.     for(int i = 1;i<=S;i++) // consideram greutatea i
  30.     {
  31.         // Avem un rucsac cu capacitatea G
  32.         for(int G = 1;G<=S;G++)
  33.         {
  34.             int sumV = 0, taken = 0 ;
  35.             dp[i][G] = dp[i-1][G];
  36.             for(int j = 0; j < A[i].size();j++)
  37.             {
  38.                 // Ne aflam intr-un item si nu stim cate sa luam din el.
  39.                 if(taken + 1 > G / i) break;
  40.                 for(int it = 1; it <= A[i][j].cnt;it++)
  41.                 {
  42.                     if(taken + 1 > G / i) break;
  43.                     taken++;
  44.                     sumV += A[i][j].val;
  45.                     dp[i][G] = max(dp[i][G], dp[i - 1][G - taken * i] + sumV);
  46.                 }
  47.             }
  48.         }
  49.  
  50.     }
  51.     cout << dp[S][S] << '\n';
  52. }
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement