Submission #1145370

#TimeUsernameProblemLanguageResultExecution timeMemory
1145370ryanarokxKnapsack (NOI18_knapsack)C++20
100 / 100
111 ms1884 KiB
#include <bits/stdc++.h>
//#define int long long
#define ii pair<int,int>
#define x first
#define y second
#define SYNC ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define lef (idx*2)+1
#define rig (idx*2)+2
#define mid (l+r)/2
#define MAX 2003

using namespace std;


int32_t main()
{
    /*
    for(int i=2000;i<=10000000;i*=10)
    {
        int s=0;
        for(int j=1;j<=i;j++)
            s+=i/j;
        cout<<i<<" "<<s<<" "<<s/i<<" "<< log2(i)<<endl;
    }
    */

    int s, n;
    cin >> s >> n;
    vector<int> v;
    vector<int> w;
    //vector<int> k;
    vector<vector<ii>> vp(MAX, vector<ii>());
    for(int i=1;i<=n;i++)
    {
        int ww, vv, kk;
        cin >> vv >> ww >> kk;
        vp[ww].push_back({-vv,kk});
    }
    for(int i=1;i<MAX;i++)
    {
        sort(vp[i].begin(),vp[i].end());
        int mx = MAX/i;
        for(int j=0;j<vp[i].size();j++)
        {
            while(vp[i][j].y && mx)
            {
                v.push_back(-vp[i][j].x);
                w.push_back(i);
                vp[i][j].y--;
                mx--;
            }
            if(mx<=0) break;
        }
    }
    int dp[2][s+1];
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<=s;j++)
            dp[i][j]=0;
    }
    for(int i=0;i<v.size();i++)
    {
        //k = min(k, MAX);
        for(int j=0;j<=s;j++)
        {
            //NOT TAKE
            int nt = dp[(i+1)%2][j];
            //TAKE
            int m = 1;// = min(k, j/w);
            int t = 0;
            //for(m=0;m<=k;m++)
            {
                if(j>=m*w[i])
                    t = dp[(i+1)%2][j-m*w[i]]+v[i]*m;
                //cout << t<< " - "<<nt<<" "<<m <<" "<<j<<" "<<w<<" "<<i<<endl;
                dp[i%2][j] = max(dp[i%2][j],max(nt, t));
            }
        }
        //for(int j=0;j<=s;j++)
            //cout << dp[i%2][j]<<" ";
        //cout<<endl;
    }
    cout << dp[(v.size()+1)%2][s];
    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...