Submission #839113

#TimeUsernameProblemLanguageResultExecution timeMemory
839113detroiddhKnapsack (NOI18_knapsack)C++17
100 / 100
114 ms36272 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;

const ll maxn = 2003;
const ll mod = 1e9 + 7;

struct TPair
{
   ll v , k;
};

bool ss(TPair i , TPair j)
{
    return i.v > j.v;
}

ll dp[maxn][maxn] , inf = 1e18;
vector<TPair>a[maxn];

int main()
{
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   //freopen("","r",stdin);
   //freopen("","w",stdout);

   int s , n;
   cin>>s>>n;

   ll v , w , k;
   for(int i = 1 ; i <= n ; ++i)
   {
       cin>>v>>w>>k;
       a[w].push_back({v , k});
   }

   for(int i = 1 ; i <= s ; ++i)
       sort(a[i].begin() , a[i].end() , ss);

   ll kq = 0;
   for(int i = 1 ; i <= s ; ++i)
    dp[i][0] = -inf;

   for(int i = 0 ; i <= s ; ++i)
    dp[0][i] = 0;

   for(int j = 1 ; j <= s ; ++j)
   {
       for(int i = 1 ; i <= s ; ++i)
       {
           dp[i][j] = dp[i][j - 1];
           ll so1 = 0 , so2 = 0;

           for(TPair h : a[j])
           {
               int dem = 0;
               while(dem < h.k)
               {
                   ++dem;
                   so1 += j;
                   so2 += h.v;
                   if(so1 > i) goto done;
                   dp[i][j] = max(dp[i][j] , dp[i - so1][j - 1] + so2);
               }
           }

           done:;

           kq = max(kq , dp[i][j]);
       }
   }

   cout<<kq;
}
#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...