제출 #995189

#제출 시각아이디문제언어결과실행 시간메모리
995189cloak0016Knapsack (NOI18_knapsack)C++14
100 / 100
114 ms36432 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

int32_t main() {
    int S, N, W, v, n, ans = -1e18;
    cin >> S >> N;
    vector<vector<pair<int, int>>> w(S + 1);
    for (int i = 0; i < N; i++) {
        cin >> v >> W >> n;
        w[W].push_back({-v, n});
    }
    for (auto& i: w) {
        if (!i.size()) continue;
        sort(i.begin(), i.end());
    }
    vector<vector<int>> dp(S + 1, vector<int>(S + 1, -1e18));
    dp[0][0] = 0;
    for (int i = 1; i <= S; i++) {
        if (!w[i].size()) {
            dp[i] = dp[i - 1];
            continue;
        }
        for (int j = 0; j <= S; j++) {
            dp[i][j] = dp[i - 1][j];
            int amnt = 0;
            int ind = 0;
            int used = 0;
            int val = 0;
            while ((amnt + 1) * i <= j && ind < (int)w[i].size()) {
                amnt++;
                val += -w[i][ind].first;
                if (dp[i - 1][j - amnt * i] != -1e18) {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - amnt * i] + val);
                }
                ans = max(ans, dp[i][j]);
                used++;
                if (used == w[i][ind].second) {
                    used = 0;
                    ind++;
                }
            }
        }
    }
    if (ans < 0) ans = 0;
    cout << ans << '\n';
    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...