Submission #1295525

#TimeUsernameProblemLanguageResultExecution timeMemory
1295525michaeltaranikKnapsack (NOI18_knapsack)C++17
37 / 100
2 ms580 KiB
#include <iostream>
#include <limits.h>
#include <vector>
#include <array>

using namespace std;

// int solvedp(int goal, vector<array<int, 2>>& items, vector<vector<int>>& memo, int idx) {
//     if (goal < 0) return INT_MIN;
//     if (goal == 0 || idx >= items.size()) return 0;
//     if (memo[goal][idx] != -1) return memo[goal][idx];

//     int skip = solvedp(goal, items, memo, idx+1); 
//     int take = solvedp(goal - items[idx][W], items, memo, idx+1);
//     if (take >= 0) {
//         take += items[idx][V];
//     }
//     int best = max(skip, take);

//     memo[goal][idx] = best;
//     return best;
// }

void solve() {
    int s, n;
    cin >> s >> n;
    vector<int> dp(s+1, 0);

    for (int i = 0; i < n; ++i) {
        int v, w, q;
        cin >> v >> w >> q;
        
        // fucking binary optimization
        for (int k = 1; q > 0; k <<= 1) {
            int take = min(k, q);
            int chunkV = take * v;
            int chunkW = take * w;

            if (chunkW <= s) {
              for (int j = s; j >= chunkW; --j) {
                dp[j] = max(dp[j], dp[j - chunkW] + chunkV);
              }
            }
            q -= take;
        }
    }

    cout << dp[s] << endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
#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...