Submission #1320962

#TimeUsernameProblemLanguageResultExecution timeMemory
1320962brinleyhongKnapsack (NOI18_knapsack)C++20
73 / 100
14 ms2596 KiB
//https://oj.uz/problem/view/NOI18_knapsack
#include <bits/stdc++.h>
using namespace std;

const int maxn = 100000;
const int maxs = 2000;
const int maxv = 1000000;

int n;
long long s, v[maxn+5], w[maxn+5], k[maxn+5], dp[maxs+5];

void read() {
    cin >> s >> n;
    for (int i = 1; i<=n; ++i) cin >> v[i] >> w[i] >> k[i];
}
void sub1() { //N = 1
    cout << v[1] * (min(k[1], s / w[1]));
}
void sub2() {  //1<=N<=100 && K[1] = 1 ---> Knapsack 0/1
    long long res = 0;
    for (int item = 1; item <= n; ++item) {
        for (int sum = s; sum > 0; --sum) {
            if (sum < w[item]) continue;
            dp[sum] = max(dp[sum - w[item]] + v[item], dp[sum]);
        }
    }
    for (int sum = 1; sum <= s; ++sum) {
        res = max(res, dp[sum]);
    }
    cout << res;
}
void sub3() { //1<=N<=100 && 1<=k[i]<=10 ---> Bounded Knapsack
    long long res = 0;
    for (int item = 1; item <= n; ++item) {
        for (int sum = s; sum > 0; --sum) {
            if (sum < w[item]) continue;
            for (int take = 1; take <= k[item]; ++take) {
                if (take * w[item] > sum) break;
                dp[sum] = max(dp[sum - take*w[item]] + take*v[item], dp[sum]);
            }
        }
    }
    for (int sum = 1; sum <= s; ++sum) {
        res = max(res, dp[sum]);
    }
    cout << res;
}
void sub4() { //1<=N<=100 && 1<=k[i]<=1e9
    vector <long long> W, V;
    for (int i = 1; i<=n; ++i) {
        long long cnt = k[i];
        long long base = 1;
        while (cnt > 0) {
            long long take = min(base, cnt);
            W.push_back(w[i]*take);
            V.push_back(v[i]*take);
            cnt -= take;
            base <<= 1;
        }
    }

    for (int i = 0; i < W.size(); ++i) {
        for (int sum = s; sum >= W[i]; --sum) {
            dp[sum] = max(dp[sum], dp[sum - W[i]] + V[i]);
        }
    }

    cout << dp[s];
}
void sub5() {

}

void solve() {
    int g = *max_element(k+1, k+n+1);

    if (g == 1) {
        sub2();
        return;
    }

    if (n == 1) sub1();
    else if (1 <= n && n <= 100 && g == 1) sub2();
    else if (1 <= n && n <= 100 && g <= 10) sub3();
    else if (1 <= n && n <= 100 && g <= 1e9) sub4();
//    else sub5();
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    read();
    solve();
    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...