Submission #1086094

#TimeUsernameProblemLanguageResultExecution timeMemory
1086094lukasuliashviliKnapsack (NOI18_knapsack)C++17
37 / 100
1 ms436 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// Function to solve the bounded knapsack problem
int knapsack(int S, int N, vector<tuple<int, int, int>>& items) {
    // dp[w] will store the max value we can achieve with weight w
    vector<int> dp(S + 1, 0);
    
    // Process each item (V: value, W: weight, K: quantity)
    for (const auto& item : items) {
        int V, W, K;
        tie(V, W, K) = item;
        
        int count = 1;
        while (K > 0) {
            int current_count = min(count, K);
            K -= current_count;
            int item_weight = current_count * W;
            int item_value = current_count * V;
            
            // Update dp array using 0/1 knapsack for this batch of items
            for (int weight = S; weight >= item_weight; --weight) {
                dp[weight] = max(dp[weight], dp[weight - item_weight] + item_value);
            }
            
            count *= 2;
        }
    }
    
    // The maximum value we can achieve with total weight <= S
    return *max_element(dp.begin(), dp.end());
}

int main() {
    int S, N;
    // Read S (maximum weight) and N (number of item types)
    cin >> S >> N;
    
    // Store the items as tuples (value, weight, quantity)
    vector<tuple<int, int, int>> items(N);
    
    for (int i = 0; i < N; ++i) {
        int V, W, K;
        cin >> V >> W >> K;
        items[i] = make_tuple(V, W, K);
    }
    
    // Solve the problem
    cout << knapsack(S, N, items) << 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...