제출 #639503

#제출 시각아이디문제언어결과실행 시간메모리
639503a_aguiloKnapsack (NOI18_knapsack)C++14
100 / 100
215 ms37456 KiB
#include<bits/stdc++.h>

using namespace std;

typedef vector<long long int> vi;
typedef vector<vi> vvi;

vvi dp;
vi values, weight, freqs;

int S, N;

int main(){
    cin >> S >> N;
    dp = vvi(S+1, vi(S+1, 0));
    values = vi(N);
    weight = vi(N);
    freqs = vi(N);
    vector<vector<pair<int, int>>> itemsWithWeight(S+1);
    for(int i = 0; i < N; ++i) {
        cin >> values[i] >> weight[i] >> freqs[i];
        itemsWithWeight[weight[i]].push_back({values[i], freqs[i]});
    }
    //cout << "a" << endl;
    for(int i = 0; i <=S; ++i)sort(itemsWithWeight[i].rbegin(), itemsWithWeight[i].rend());
    //cout << "a" << endl;
    long long int ans = 0;
    for(int i = 1; i <= S; ++i){
        for(int weight = 0; weight <= S; ++weight){
            int accumulatedWeight = 0;
            int accumulatedValue = 0;
            dp[weight][i] = dp[weight][i-1];
            ans = max(ans, dp[weight][i]);
            for(pair<int, int> item: itemsWithWeight[i]){
                int myVal = item.first;
                int reps = item.second;
                for(int rep = 0; rep < reps; ++rep){
                    accumulatedWeight += i;
                    accumulatedValue += myVal;
                    if(accumulatedWeight > weight) break;
                    dp[weight][i] = max(dp[weight][i], dp[weight - accumulatedWeight][i-1] + accumulatedValue);
                    ans = max(ans, dp[weight][i]);
                }
                if(accumulatedWeight > weight) break;
            }
        }
    }
    cout << ans << endl;
    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...