제출 #1291133

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

#define ll long long

void solve()
{
    int mw, n;
    cin >> mw >> n;

    vector<pair<int, int>> faw[mw + 1];
    for (int i = 0; i < n; i++) {
        int w, v, a;
        cin >> v >> w >> a;
        faw[w].push_back({v, a});
    }
    for (int i = 1; i <= mw; i++) {
        sort(faw[i].rbegin(), faw[i].rend());
    }
    vector<int> aw[mw + 1];
    for (int i = 1; i <= mw; i++) {
        int ct = mw / i + 1;
        for (auto& [v, a] : faw[i]) {
            for (int p = 0; p < a; p++) {
                aw[i].push_back(v);
                ct--;
                if (ct == 0) break;
            }
            if (ct == 0) break;
        }
    }
    int dp[mw + 1];
    for (int i = 0; i <= mw; i++) dp[i] = 0;
    for (int i = 1; i <= mw; i++) {
        int pm = min(mw / i + 1, (int)aw[i].size());
        for (int j = 0; j < pm; j++) {
            for (int p = mw; p >= i; p--) {
                dp[p] = max(dp[p - i] + aw[i][j], dp[p]);
            }
        }
    }
    //for (auto& p : dp) cout << p << ' ';
    cout << dp[mw];
}

int main() 
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int t = 1;
    //cin >> t;
    while (t--) {
        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...