제출 #605308

#제출 시각아이디문제언어결과실행 시간메모리
605308ArapakKnapsack (NOI18_knapsack)C++17
100 / 100
249 ms88996 KiB
#include <bits/stdc++.h> using namespace std; struct ele { int index; int value; int weight; int number; }; vector<ele> items; int main() { int s,n; cin>>s>>n; vector<vector<int>> weights(s+1); items.resize(n); for(int i=0;i<n;i++) { items[i].index = i; cin>>items[i].value>>items[i].weight>>items[i].number; } for(auto it : items) { weights[it.weight].push_back(it.index); } for(int i=1;i<=s;i++) { sort(weights[i].begin(), weights[i].end(), [](const int a, const int b) { return items[a].value > items[b].value; }); // for(auto it : weights[i]) // cout<<it<<' '; // cout<<'\n'; } vector<int> result(s+1); vector<unordered_map<int,int>> how(s+1); result[0] = 0; for(int i=1;i<=s;i++) { result[i] = result[i-1]; int w = 1, ind = -1; // cout<<"i: "<<i<<'\n'; for(int j=1;j<=i;j++) { if(weights[j].empty()) continue; int item_index = 0; int res = 0; for(int index : weights[j]) { // cout<<" index: "<<index<<'\n'; if(how[i-j].count(index) && how[i-j][index] >= items[index].number) continue; res = result[i-j] + items[index].value; if(res < result[i]) break; item_index = index; break; } if(res > result[i]) { result[i] = res; w = j; ind = item_index; } } how[i] = how[i-w]; if(ind != -1) how[i][ind]++; // cout<<"i: "<<i<<" result: "<<result[i]<<'\n'; } cout<<result[s]<<'\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...