Submission #1301709

#TimeUsernameProblemLanguageResultExecution timeMemory
1301709orzorzorzKnapsack (NOI18_knapsack)C++20
73 / 100
1095 ms588 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int mxS = 2005; // Slightly larger for safety
ll dp[mxS];

int main() {
    ios::sync_with_stdio(0); cin.tie(0);

    int s, n; 
    cin >> s >> n;

    // Use specific variables instead of array for readability and speed
    // dp array initialization
    fill(dp, dp + s + 1, -1e18); // Initialize only up to S
    dp[0] = 0;

    ll ans = 0;

    for(int i = 0; i < n; i++) {
        ll val, w, k;
        cin >> val >> w >> k;

        // Optimization: If weight is 0 or value is negative/useless, skip
        if (k == 0 || w == 0) continue; 

        // HYBRID OPTIMIZATION START
        // If total weight of all copies exceeds capacity, treat as infinite (Complete Knapsack)
        if (w * k >= s) {
            for (int j = w; j <= s; j++) {
                if (dp[j-w] != -1e18) {
                    dp[j] = max(dp[j], dp[j-w] + val);
                }
                ans = max(ans, dp[j]);
            }
        } 
        // Otherwise, use your existing Binary Splitting method
        else {
            ll use = k;
            for (ll j = 1; use > 0; j *= 2) {
                ll take = min(use, j);
                ll weight_chunk = take * w;
                ll value_chunk = take * val;
                
                for (int pos = s; pos >= weight_chunk; pos--) {
                    if (dp[pos - weight_chunk] != -1e18) {
                        dp[pos] = max(dp[pos], dp[pos - weight_chunk] + value_chunk);
                    }
                    ans = max(ans, dp[pos]);
                }
                use -= take;
            }
        }
        // HYBRID OPTIMIZATION END
    }

    cout << ans;
    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...