제출 #1289918

#제출 시각아이디문제언어결과실행 시간메모리
1289918maithedungKnapsack (NOI18_knapsack)C++20
100 / 100
44 ms3688 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define exit return 0
#define cap pair<int,int>
#define fi first
#define se second
#define pb push_back
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define FOD(i,r,l) for(int i=r;i>=l;i--)
#define fill(f,x) memset(f,x,sizeof(f))
#define lcm(a,b) (a/__gcd(a,b)*b)
#define TIME 1.0 * clock() / CLOCKS_PER_SEC
priority_queue<cap> q[20005];
int dp[2000005];
signed main()
{
    fast;
    int n,s;
    cin>>s>>n;
    FOR(i,1,n)
    {
        int v,w,k;
        cin>>v>>w>>k;
        q[w].push({v,k});
    }
    vector<cap> v;
    FOR(i,1,s)
    {
        int max_choose=s/i;
        while(!q[i].empty() && max_choose)
        {
            cap tmp=q[i].top();
            q[i].pop();
            int val=tmp.first;
            int sl=tmp.second;
            sl=min(sl,max_choose);
            FOR(j,1,sl) v.push_back({i,val});
            max_choose-=sl;
        }
    }
    FOR(i,0,v.size()-1)
    {
        int w=v[i].first;
        int val=v[i].second;
        FOD(j,s,1)
        {
            if(w<=j) dp[j]=max(dp[j],dp[j-w]+val);
        }
    }
    cout<<dp[s];
    exit;
}
/*
░▒▓███████▓▒░░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░ ░▒▓██████▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒▒▓███▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░
░▒▓███████▓▒░ ░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░


*/


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