rcpl

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ruthen71/rcpl

:heavy_check_mark: verify/aoj_dpl/aoj_dpl_1_g.test.cpp

Depends on

Code

#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_G"

#include <bits/stdc++.h>

#include "dp/knapsack_limitations.hpp"

int main() {
    int N, W;
    std::cin >> N >> W;
    std::vector<int> v(N), w(N), m(N);
    for (int i = 0; i < N; i++) std::cin >> v[i] >> w[i] >> m[i];
    auto ret1 = knapsack_limitations(w, v, m, W, -1);
    auto ans1 = *std::max_element(ret1.begin(), ret1.end());
    for (int i = 0; i < N; i++) v[i] = -v[i];
    auto ret2 = knapsack_limitations(w, v, m, W, 1, std::less<int>());
    auto ans2 = *std::min_element(ret2.begin(), ret2.end());
    assert(ans1 == -ans2);
    std::cout << ans1 << '\n';
    return 0;
}
#line 1 "verify/aoj_dpl/aoj_dpl_1_g.test.cpp"
#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_1_G"

#include <bits/stdc++.h>

#line 2 "dp/knapsack_limitations.hpp"

template <class T, class F = std::greater<T>>
std::vector<T> knapsack_limitations(const std::vector<int> &w, const std::vector<T> &v, const std::vector<int> &m,  //
                                    const int W, const T &e, const F &comp = F(), const int s = 0) {
    const int n = (int)w.size();
    std::vector<T> dp(W + 1, e), deqv(W + 1);
    std::vector<int> deq(W + 1);
    dp[s] = T(0);
    for (int i = 0; i < n; i++) {
        if (w[i] > 0) {
            for (int a = 0; a < w[i]; a++) {
                int s = 0, t = 0;
                for (int j = 0; a + j * w[i] <= W; j++) {
                    if (dp[a + j * w[i]] != e) {
                        T val = dp[a + j * w[i]] - j * v[i];
                        while (s < t and comp(val, deqv[t - 1])) t--;
                        deq[t] = j;
                        deqv[t++] = val;
                    }
                    if (s < t) {
                        dp[a + j * w[i]] = deqv[s] + j * v[i];
                        if (deq[s] == j - m[i]) s++;
                    }
                }
            }
        } else if (w[i] < 0) {
            for (int a = 0; a < -w[i]; a++) {
                int s = 0, t = 0;
                for (int j = 0; W - a + j * w[i] >= 0; j++) {
                    if (dp[W - a + j * w[i]] != e) {
                        T val = dp[W - a + j * w[i]] - j * v[i];
                        while (s < t and comp(val, deqv[t - 1])) t--;
                        deq[t] = j;
                        deqv[t++] = val;
                    }
                    if (s < t) {
                        dp[W - a + j * w[i]] = deqv[s] + j * v[i];
                        if (deq[s] == j - m[i]) s++;
                    }
                }
            }
        } else {
            // w[i] = 0
            continue;
        }
    }
    return dp;
}
#line 6 "verify/aoj_dpl/aoj_dpl_1_g.test.cpp"

int main() {
    int N, W;
    std::cin >> N >> W;
    std::vector<int> v(N), w(N), m(N);
    for (int i = 0; i < N; i++) std::cin >> v[i] >> w[i] >> m[i];
    auto ret1 = knapsack_limitations(w, v, m, W, -1);
    auto ans1 = *std::max_element(ret1.begin(), ret1.end());
    for (int i = 0; i < N; i++) v[i] = -v[i];
    auto ret2 = knapsack_limitations(w, v, m, W, 1, std::less<int>());
    auto ans2 = *std::min_element(ret2.begin(), ret2.end());
    assert(ans1 == -ans2);
    std::cout << ans1 << '\n';
    return 0;
}
Back to top page