Submission #1179948

#TimeUsernameProblemLanguageResultExecution timeMemory
1179948prism7kKnapsack (NOI18_knapsack)C++17
100 / 100
94 ms33096 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; ll dp[2001][2001]; ll inf = 2e18+5; int main() { int S, N; cin >> S >> N; map<int, vector<pair<int, int>>> weight_groups; for(int i = 0, v, w, k; i < N; ++i) { cin >> v >> w >> k; weight_groups[w].push_back({v, k}); } for(int i = 0; i <= 2000; ++i) { for(int j = 0; j <= 2000; ++j) { dp[i][j] = -inf; } } dp[0][0] = 0; int cur_item = 0; for(auto &[weight, group] : weight_groups) { cur_item++; sort(group.begin(), group.end(), greater<pair<int, int>>()); for(int i = 0; i <= S; ++i) { int take = 0; int groups_taken = 0; int local_at = 0; ll value = 0; dp[cur_item][i] = dp[cur_item-1][i]; while(weight * (take + 1) <= i && groups_taken < (int)group.size()) { take++; value += group[groups_taken].first; dp[cur_item][i] = max( dp[cur_item][i], dp[cur_item-1][i - weight * take] + value ); local_at++; if(local_at == group[groups_taken].second) { local_at = 0; groups_taken++; } } } } ll mx = 0; for(int i = 0; i <= S; ++i) mx = max(mx, dp[cur_item][i]); cout << mx << "\n"; }
#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...