Submission #1218645

#TimeUsernameProblemLanguageResultExecution timeMemory
1218645pauloaphKnapsack (NOI18_knapsack)C++20
17 / 100
1 ms328 KiB
#include<iostream>
#include<algorithm>
#include <cmath>
using namespace std;

const int MAXN =  100000;
const int MAXC = 1000;

int main(){

    int C;
    int n;

    cin >> C >> n;

    int V[n];
    int W[n];
    long int B[n];
    

    for (int i = 0; i < n; i++){
        cin >> V[i] >> W[i] >> B[i];
    }

    if(n == 1){
        if(V[0] <= C){
            cout << V[0] << endl;
        }
        else{
            cout << 0 << endl;
        }
        return 0;
    }

    vector<long> NW, NV;
    long int M = 0;


    // vamos criar os novos itens (pacotes)
    for (int i = 0; i < n; ++i ){
        if(B[i] > 1){
            int pos = 0;
            // procuramos o bit mais significativo
            while ( (1 << pos) < B[i] ){
                pos++;
            } 
            // aqui sabemos que (2 ^ pos) >= B[i]
            pos--;
            // agora 2 ^ pos < B[i], logo (2 ^ pos) - 1 <= B[i] 
            while ( pos >= 0 ){
                NW.push_back((1 << pos) * W[i]);
                NV.push_back((1 << pos) * V[i]);
                B[i] -= (1 << pos);
                M++;
                pos--;
            }
            if ( B[i] ){ // se sobrou um resto
                NW.push_back(B[i] * W[i]);
                NV.push_back(B[i] * V[i]);
                M++;
                B[i] = 0;
            }
        } else {
            NW.push_back(W[i]);
            NV.push_back(V[i]);
            M++;
            B[i] = 0;
        }
        
    }

    long int dp[2][C+1];
    int prev = 0, act = 1;
    // caso base : quando nao temos mais itens
    for ( int c = 0; c <= C; ++c )
        dp[prev][c] = 0;


    for ( int i = NW.size(); i >= 0; --i ){
        for ( int c = 0; c <= C; ++c ){
            dp[act][c] = dp[prev][c];
            if ( NW[i] <= c ) {
                dp[act][c] = max( dp[act][c], dp[prev][c - NW[i]] + NV[i] );
            }
        }
        swap( act, prev );
    }
      
   cout << dp[prev][C] << 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...