#include <iostream> #include <vector> using namespace std; class JellyBean { public: int weight; long long price; }; int n, k, m; vector<vector<JellyBean>> colours; vector<long long> *prices = nullptr; vector<long long> *createPrices() { return new vector<long long>(m, -1); } void updatePrices(vector<long long> *newPrices) { delete prices; prices = newPrices; } bool computeSingleSets() { for (int i = 0; i < k; i++) { if (colours[i].size() == 0) { return false; } vector<long long> *newPrices = createPrices(); for (int r = 0; r < m; r++) { if (prices->at(r) > 0 || i + r == 0) { for (auto &jellyBean : colours[i]) { int weight = (r + jellyBean.weight) % m; long long price = max(0LL, prices->at(r)) + jellyBean.price; if (newPrices->at(weight) < 0 || newPrices->at(weight) > price) { newPrices->at(weight) = price; } } } } updatePrices(newPrices); } return true; } bool newPrice(int weight, long long price) { if (prices->at(weight) < 0 || prices->at(weight) > price) { prices->at(weight) = price; return true; } return false; } void computeCompositions() { bool changed = true; while (changed) { changed = false; for (int r1 = 0; r1 < m; r1++) { for (int r2 = 0; r2 <= r1; r2++) { long long price1 = prices->at(r1); long long price2 = prices->at(r2); if (price1 > 0 && price2 > 0) { if (newPrice((r1 + r2) % m, price1 + price2)) { changed = true; } } } } } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k >> m; colours.resize(k); prices = createPrices(); for (int i = 0; i < n; i++) { int colour; cin >> colour; JellyBean jellyBean; cin >> jellyBean.weight; cin >> jellyBean.price; colours[colour - 1].push_back(jellyBean); } if (!computeSingleSets()) { cout << 0 << endl; for (int r = 1; r < m; r++) { cout << -1 << endl; } return 0; } computeCompositions(); prices->at(0) = 0; for (int r = 0; r < m; r++) { cout << prices->at(r) << endl; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <iostream> #include <vector> using namespace std; class JellyBean { public: int weight; long long price; }; int n, k, m; vector<vector<JellyBean>> colours; vector<long long> *prices = nullptr; vector<long long> *createPrices() { return new vector<long long>(m, -1); } void updatePrices(vector<long long> *newPrices) { delete prices; prices = newPrices; } bool computeSingleSets() { for (int i = 0; i < k; i++) { if (colours[i].size() == 0) { return false; } vector<long long> *newPrices = createPrices(); for (int r = 0; r < m; r++) { if (prices->at(r) > 0 || i + r == 0) { for (auto &jellyBean : colours[i]) { int weight = (r + jellyBean.weight) % m; long long price = max(0LL, prices->at(r)) + jellyBean.price; if (newPrices->at(weight) < 0 || newPrices->at(weight) > price) { newPrices->at(weight) = price; } } } } updatePrices(newPrices); } return true; } bool newPrice(int weight, long long price) { if (prices->at(weight) < 0 || prices->at(weight) > price) { prices->at(weight) = price; return true; } return false; } void computeCompositions() { bool changed = true; while (changed) { changed = false; for (int r1 = 0; r1 < m; r1++) { for (int r2 = 0; r2 <= r1; r2++) { long long price1 = prices->at(r1); long long price2 = prices->at(r2); if (price1 > 0 && price2 > 0) { if (newPrice((r1 + r2) % m, price1 + price2)) { changed = true; } } } } } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k >> m; colours.resize(k); prices = createPrices(); for (int i = 0; i < n; i++) { int colour; cin >> colour; JellyBean jellyBean; cin >> jellyBean.weight; cin >> jellyBean.price; colours[colour - 1].push_back(jellyBean); } if (!computeSingleSets()) { cout << 0 << endl; for (int r = 1; r < m; r++) { cout << -1 << endl; } return 0; } computeCompositions(); prices->at(0) = 0; for (int r = 0; r < m; r++) { cout << prices->at(r) << endl; } return 0; } |