제출 #1139210

#제출 시각아이디문제언어결과실행 시간메모리
1139210ndanKnapsack (NOI18_knapsack)C++20
100 / 100
65 ms7568 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;
#define forr(i, a, b) for (int i = (a), _b = (b); i <= _b; ++i)
#define ford(i, b, a) for (int i = (b), _a = (a); i >= _a; --i)
#define forf(i, a, b) for (int i = (a), _b = (b); i < _b; ++i)
#define file "test"
#define fi first
#define se second
const int maxn = 1e5 + 5;

ll s, n, v[maxn], w[maxn], k[maxn];

namespace sub1 {
    bool check() {
        return n == 1;
    }
    void solve() {
        cout << v[1] * min(s / w[1], k[1]);
    }
}

namespace sub2 {
    bool check() {
        if (n > 100)
            return 0;
        forr(i, 1, n)
            if (k[i] > 1)
                return 0;
        return 1;
    }
    void solve() {
        ll dp[2005];
        memset(dp, 0, sizeof dp);
        forr(i, 1, n)
            ford(j, s, w[i])
                dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
        cout << dp[s];
    }
}

namespace sub34 {
    bool check() {
        if (n > 100)
            return 0;
        forr(i, 1, n)
            if (k[i] > 10)
                return 0;
        return 1;
    }
    void solve() {
        ll dp[2005];
        memset(dp, 0, sizeof dp);
        forr(i, 1, n)
            ford(j, s, w[i])
                forr(sl, 1, min(k[i], j / w[i]))
                    dp[j] = max(dp[j], dp[j - w[i] * sl] + v[i] * sl);
        cout << dp[s];
    }
}

namespace subfull {
    void solve() {
        ll dp[2005];
        memset(dp, 0, sizeof dp);
        vector<pll> obj[maxn];
        forr(i, 1, n)
            obj[w[i]].push_back({v[i], k[i]});
        forr(i, 0, s) {
            if (obj[i].size() == 0) continue;
            int idx = 0;
            sort(obj[i].begin(), obj[i].end(), greater<pll>());
            forr(sl, 1, s / i) {
                if (idx >= obj[i].size()) break;
                ford(j, s, i)
                    dp[j] = max(dp[j], dp[j - i] + obj[i][idx].fi);
                obj[i][idx].se--;
                if (obj[i][idx].se == 0) idx++;
            }
        }
        cout << dp[s];
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    // freopen(file".inp", "r", stdin);
    // freopen(file".out", "w", stdout);
    cin >> s >> n;
    forr(i, 1, n)
        cin >> v[i] >> w[i] >> k[i];
    if (sub1::check()) sub1::solve();
    else if (sub2::check()) sub2::solve();
    else if (sub34::check()) sub34::solve();
    else subfull::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...