Submission #1283374

#TimeUsernameProblemLanguageResultExecution timeMemory
1283374muramasaKnapsack (NOI18_knapsack)C++20
100 / 100
49 ms34360 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fr(i,a,b,c) for(int i = a;i<b;i+=c)
#define fre(i,a,b,c) for(int i = a;i>=b;i-=c)
#define fs first
#define sc second
#define all(a) a.begin(),a.end()
#define IINF 2000000005
#define LINF 1000000000000000005
#define MOD 998244353
#define str string
#define endl '\n'
using pii = pair<int,int>;
using pll = pair<ll,ll>;    
using tiii = tuple<int,int,int>;


int main(){
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    int s,n;cin >> s >> n;
    vector<vector<pll>> a(s+1);
    for(int i = 0 ;i < n;++i){
        int v,w,k;cin >> v >> w >> k;
        a[w].push_back({v,k});
    }
    for(int i = 1;i<=s;++i)sort(a[i].rbegin(),a[i].rend());
    vector<vector<ll>> dp(s+1,vector<ll>(s+1));
    dp[0][0] = 0;
    for(int i = 1;i <= s;++i){
        dp[i] = dp[i-1];
        for(int j = i; j <= s ; j+=i){
            ll v = 0;
            ll used = j/i;
            for(int k = 0;k < a[i].size();++k){
                if(!used)break;
                v += a[i][k].fs * min(used,a[i][k].sc);
                used -= min(used,a[i][k].sc);
            }
            if(used > 0)break;
            for(int k = s;k >= j;--k){
                if(dp[i - 1][k - j] != -1)dp[i][k] = max(dp[i][k],dp[i-1][k - j] + v);
            }
        }
    }
    ll mx = 0;
    for(int i = 1;i<=s;++i)mx = max(mx,dp[s][i]);
    cout << mx << 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...