Submission #1224873

#TimeUsernameProblemLanguageResultExecution timeMemory
1224873builder_opKnapsack (NOI18_knapsack)C++20
73 / 100
1097 ms18548 KiB
#include <bits/stdc++.h>
using namespace std; 
#define ll long long
#define vll vector<long long>
#define pb push_back
#define endll "\n"
#define vvll vector<vector<long long>>
const int MOD = 1e9 + 7;
#define rep(i, a , n) for (int i = a; i < (n); i++)
#define nrep(i, n , a) for (int i = n-1; i >= (a); i--)

void dbg_out() { cerr << endl; }

template<typename Head, typename... Tail>
void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }

template<typename K, typename V>
void dbg_out(const map<K, V>& m) {
    cerr << "{ ";
    for (const auto& pair : m) {
        cerr << "(" << pair.first << ", " << pair.second << ") ";
    }
    cerr << "}";
}

template<typename T>
void dbg_out(const set<T>& s) {
    cerr << "{ ";
    for (const auto& elem : s) {
        cerr << elem << " ";
    }
    cerr << "}";
}

template<typename T>
void dbg_out(const vector<T>& v) {
    cerr << "[ ";
    for (const auto& elem : v) {
        cerr << elem << " ";
    }
    cerr << "]";
}

#define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)

void solve()
{
    ll s , n ; cin >> s >> n;
    vll prize(n) , weight(n) , qty(n);

    for(int i = 0 ; i < n ; i++)
    {
        cin >> prize[i] >> weight[i] >> qty[i];
        qty[i] = min(qty[i] , s/weight[i]);
    }

    vll dp(s+1);
    vll weightt , prizz;
    dp[s] = 0;
    rep(idx, 0, n) 
    {
        ll v = prize[idx], w = weight[idx], k = min(qty[idx], s / w);
        for (ll p = 1; k > 0; p <<= 1) 
        {
            ll take = min(p, k);     
            weightt.pb(take * w);
            prizz.pb(take * v);
            k -= take;
        }
    }


    for(ll j = 0 ; j < weightt.size() ; j++)
    {
        for(ll i = s ; i >= 0 ; i--)
        {
            if(i >= weightt[j])
            dp[i] = max(dp[i - weightt[j]] + prizz[j], dp[i]);
        }
    }

    cout << dp[s];
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    auto start = chrono::high_resolution_clock::now();
    int tt = 1; //cin >> tt;
    while(tt--)
        solve();
    auto end = chrono::high_resolution_clock::now();
    chrono::duration<double> duration = end - start;
    //cout << "Time taken: " << duration.count() << " seconds" << endl;
    
    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...