제출 #672366

#제출 시각아이디문제언어결과실행 시간메모리
672366senagoKnapsack (NOI18_knapsack)C++17
100 / 100
53 ms3788 KiB
#include <algorithm> #include <iostream> #include <limits> #include <unordered_map> #include <vector> struct item { size_t value = 0; size_t count = 0; }; inline bool cmp_most_valuable(const item& lhs, const item& rhs) noexcept { return lhs.value > rhs.value || (lhs.value == rhs.value && lhs.count > rhs.count); }; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); size_t amount_of_types = 0, capacity = 0; std::cin >> capacity >> amount_of_types; std::unordered_map<size_t, std::vector<item>> buckets; buckets.reserve(amount_of_types); for (size_t i = 0; i < amount_of_types; ++i) { size_t weight = 0, value = 0, count = 0; std::cin >> value >> weight >> count; if (weight <= capacity) { buckets[weight].push_back({value, count}); } } std::vector<size_t> dp(capacity + 1, 0); for (auto& it : buckets) { auto& bucket = it.second; const size_t weight = it.first; std::sort(bucket.begin(), bucket.end(), cmp_most_valuable); size_t index = 0; for (size_t count = 1; count * weight <= capacity && index < bucket.size(); ++count) { for (size_t cap = capacity; cap >= weight; --cap) { dp[cap] = std::max(dp[cap], dp[cap - weight] + bucket[index].value); } --bucket[index].count; if (bucket[index].count == 0) { ++index; } } } std::cout << dp[capacity] << '\n'; 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...