Submission #1129226

#TimeUsernameProblemLanguageResultExecution timeMemory
1129226jackofall718Knapsack (NOI18_knapsack)C++20
100 / 100
96 ms1776 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// Global variables for storing the capacity of the knapsack, number of items, value, weight, and number of copies respectively.
int S, N, V, W, K;

// A is an array of vectors, where each vector holds pairs of value and count for items of a particular weight.
vector <pair<int, int>> A[2001];

// dp array to store the maximum value obtainable with a certain weight, answer variable to keep the maximum result.
long long dp[2001], answer;

int main(){
    // Input the capacity of the knapsack and number of different types of items
    cin >> S >> N;

    // Reading the value, weight, and number of copies of each item
    for(int i = 0; i < N; i++){
        cin >> V >> W >> K;
        // Storing value and the number of copies for each weight
        A[W].push_back(make_pair(V, K));
    }

    // Iterate through each possible weight from 1 up to the maximum weight capacity S
    for(int i = 1; i <= S; i++){
        // If there are items of weight i, sort them by value in descending order (higher value first)
        sort(A[i].begin(), A[i].end(), greater<pair<int, int>>());

        int index = 0; // Index to track the number of different value groups of the current weight

        // Iterate j times where j is the maximum number of items of weight i that can be included without exceeding the capacity
        for(int j = 0; j < S / i; j++){
            // Check if there are no more items left of the current weight
            if(index >= A[i].size()) break;

            // Iterate through the knapsack weights from the capacity down to the current item weight
            for(int k = S; k >= i; k--){
                // Update dp[k] to be the max of itself or the value of including one more of the current item
                dp[k] = max(dp[k], dp[k - i] + A[i][index].first);
                // Update the answer with the maximum value found so far
                answer = max(answer, dp[k]);
            }
            
            // Decrement the number of available copies of the current item
            A[i][index].second--;

            // If all copies of the current item are used, move to the next group of items of the same weight
            if(A[i][index].second == 0) index++;
        }
    }

    // Output the maximum value that can be obtained
    cout << answer << 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...