Submission #491431

#TimeUsernameProblemLanguageResultExecution timeMemory
491431CodigoLKnapsack (NOI18_knapsack)C++14
100 / 100
60 ms2120 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define mp make_pair

#define forn(i,n) for(int i = 0;i<int(n);i++)
#define dforn(i,n) for(int i = int(n)-1;i>=0;i--)
#define forsn(i,s,n) for(int i = int(s);i<int(n);i++)
#define fore(i,s,n) for(int i = int(s);i<int(n);i++)
#define dforsn(i,s,n) for(int i = int(n)-1;i>=int(s);i--)

#define DBG(x) do{cout<<#x<<" = "<<x<<endl;}while(false)
#define TAM_MASK 1
#define get(mask,i) ((mask>>(TAM_MASK*(i)) & ( (1<<TAM_MASK)-1)))
#define set(mask,i,v)  ( ((mask & ~( ( (1<<TAM_MASK)-1) << (TAM_MASK*(i)) )) | (v<<(TAM_MASK * (i))) ))
#define popcount(mask) (__builtin_popcount(mask))
#define endl '\n'
#define ALL(x) x.begin(),x.end()
template<class T> ostream & operator<<(ostream & out, vector<T> & v)
{
    out<<"[";
    for(auto k : v) out<<k<<",";
    out<<"]"<<"\n";
    return out;
}
template<class T> ostream & operator<<(ostream & out, set<T>  s)
{
    out<<"{";
    for(auto k : s) out<<k<<",";
    out<<"}"<<"\n";
    return out;
}

template<class T, class U> ostream & operator<<(ostream & out, pair<T,U>  p)
{
    out<<"[ "<<p.first<<" , "<<p.second<<" ] ";
    return out;
}
template<class T, class U> istream & operator>>(istream & in, pair<T,U> & p)
{
    in>>p.first>>p.second;
    return in;
}


typedef long long intl;
const int maxs = 2005;
vector<pair<int,int> > ins[maxs];
vector<pair<int,int> > in;
intl dp[maxs];
int main()
{
    cin.tie(0);
    cin.sync_with_stdio(0);
    int S,N;
    cin>>S>>N;
    forn(i,N){
        int v,w,k;
        cin>>v>>w>>k;
        ins[w].pb({v,k});
    }
    forsn(i,1,maxs){
        sort(ins[i].begin(),ins[i].end());
        int t = S/i + 1;
        while(t and ins[i].size()){
            in.pb({i,ins[i].back().first});
            ins[i].back().second--;
            if(ins[i].back().second==0)
                ins[i].pop_back();
            t--;
        }
    }
    for(auto pp : in){
        int w = pp.first;
        int v = pp.second;
        dforn(i,S-w+1){
            dp[i+w] = max(dp[i+w],dp[i]+v);
        }
    }
    intl res = 0;
    forn(i,S+1) res = max(res,dp[i]);
    cout<<res<<endl;
}

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