제출 #1305928

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

int main() {
    int n, x; cin >> x >> n;
    vector<int> w(n), v(n), k(n);
    for (int i = 0; i < n; i++) cin >> v[i] >> w[i] >> k[i];
    vector<long long> dp(x+1);
    for (int i = 0; i < n; i++) {
        if ((long long)k[i]*w[i] >= x) {
            for (int j = w[i]; j <= x; j++) dp[j] = max(dp[j], dp[j-w[i]]+v[i]);
        } else {
            int count = k[i];
            for (int mul = 1; count > 0; mul <<= 1) {
                for (int mul = 1; count > 0; mul <<= 1) {
                    int take = min(mul,count);
                    long long tw = (long long)take*w[i], tv = (long long)take*v[i];
                    for (int j = x; j >= tw; j--) dp[j] = max(dp[j],dp[j-tw]+tv);
                    count -= take;
                }
            }
        }
    }
    cout << dp.back();
}
#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...