제출 #1340779

#제출 시각아이디문제언어결과실행 시간메모리
1340779domiKnapsack (NOI18_knapsack)C++20
100 / 100
37 ms2928 KiB
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "YES" << endl; return; }
#define NO { cout << "NO" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

const int SMAX = 5e3;
const int NMAX = 1e5;

using namespace std;

vector<pair<int, int>> obj;
vector<pair<int, int>> vec[SMAX + 5];
int dp[SMAX + 5], n, S;

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> S >> n;

    for (int i = 1, v, w, k; i <= n; ++i) {
        cin >> v >> w >> k;
        vec[w].push_back({v, k});
    }

    fill(dp + 1, dp + S + 1, INT_MIN);
    dp[0] = 0;
    for (int w = 1; w <= S; ++w) {
        sort(all(vec[w]), std::greater());
        int sum_w = 0;
        for (auto &[v, k] : vec[w]) {
            for (int i = 0; i < k; ++i) {
                sum_w += w;
                if (sum_w > S) break;

                for (int j = S; j >= w; --j)
                    dp[j] = max(dp[j], dp[j - w] + v);
            }
        }
    }

    cout << *max_element(dp, dp + S + 1) << '\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...