#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>
using namespace std;
const long long INF = (long long)1e18 + 1;
struct jelly_bean {
int color;
int weight;
int price;
bool operator<(const jelly_bean &a) const {
return color < a.color;
}
};
vector<long long> knapsack(vector<jelly_bean> items, int diff_colors, int m) {
vector<vector<long long>>
res(diff_colors + 1, vector<long long>(m, INF));
res[0][0] = 0;
int curr_color = 0;
for (int i = 0; i < items.size(); i++) {
if (items[i].color != items[i - 1].color) {
curr_color++;
}
for (int j = 0; j < m; j++) {
int subtracted = (j - items[i].weight) % m;
if (subtracted < 0)
subtracted += m;
res[curr_color][j] = min(res[curr_color][j], res[curr_color - 1][subtracted]
+ items[i].price);
}
}
return res.back();
}
vector<long long> concat(vector<long long> one_color, int m) {
vector<long long> potentially(one_color.size(), INF);
for (int i = 0; i < (int)one_color.size(); i++) {
if (one_color[i] != INF)
potentially[i] = INF + 1;
}
for (int i = 0; i < (int)one_color.size(); i++) {
for (int j = 0; j < (int)one_color.size(); j++) {
int idx = (i + j) % m;
long long sum = one_color[i] + one_color[j];
if (potentially[idx] != -1 && potentially[idx] > sum)
potentially[idx] = sum;
}
}
while (true) {
int min_idx = 0;
for (int i = 0; i < (int)one_color.size(); i++) {
if (potentially[i] < potentially[min_idx]) {
min_idx = i;
}
}
if (potentially[min_idx] == INF + 1)
break;
one_color[min_idx] = potentially[min_idx];
potentially[min_idx] = INF + 1;
int new_idx = min_idx;
for (int i = 0; i < (int)one_color.size(); i++) {
if (potentially[new_idx] != INF + 1 &&
one_color[i] + one_color[min_idx] < potentially[new_idx]) {
potentially[new_idx] = one_color[i] + one_color[min_idx];
}
new_idx++;
if (new_idx >= m)
new_idx -= m;
}
}
return one_color;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, k, m;
cin >> n >> k >> m;
vector<jelly_bean> jelly_beans(n);
unordered_set<int> colors;
int n_i, k_i, m_i;
for (int i = 0; i < n; i++) {
cin >> n_i >> k_i >> m_i;
jelly_beans[i] = {n_i, k_i, m_i};
colors.insert(n_i);
}
if (colors.size() != k) {
cout << "0\n";
for (int i = 0; i < m - 1; i++) {
cout << -1 << '\n';
}
return 0;
}
sort(jelly_beans.begin(), jelly_beans.end());
vector<long long> one_color = knapsack(jelly_beans, k, m);
one_color[0] = 0;
vector<long long> prices = concat(one_color, m);
for (int i = 0; i < m; i++) {
cout << (prices[i] != INF ? prices[i] : -1) << '\n';
}
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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | #include <iostream> #include <vector> #include <unordered_set> #include <algorithm> using namespace std; const long long INF = (long long)1e18 + 1; struct jelly_bean { int color; int weight; int price; bool operator<(const jelly_bean &a) const { return color < a.color; } }; vector<long long> knapsack(vector<jelly_bean> items, int diff_colors, int m) { vector<vector<long long>> res(diff_colors + 1, vector<long long>(m, INF)); res[0][0] = 0; int curr_color = 0; for (int i = 0; i < items.size(); i++) { if (items[i].color != items[i - 1].color) { curr_color++; } for (int j = 0; j < m; j++) { int subtracted = (j - items[i].weight) % m; if (subtracted < 0) subtracted += m; res[curr_color][j] = min(res[curr_color][j], res[curr_color - 1][subtracted] + items[i].price); } } return res.back(); } vector<long long> concat(vector<long long> one_color, int m) { vector<long long> potentially(one_color.size(), INF); for (int i = 0; i < (int)one_color.size(); i++) { if (one_color[i] != INF) potentially[i] = INF + 1; } for (int i = 0; i < (int)one_color.size(); i++) { for (int j = 0; j < (int)one_color.size(); j++) { int idx = (i + j) % m; long long sum = one_color[i] + one_color[j]; if (potentially[idx] != -1 && potentially[idx] > sum) potentially[idx] = sum; } } while (true) { int min_idx = 0; for (int i = 0; i < (int)one_color.size(); i++) { if (potentially[i] < potentially[min_idx]) { min_idx = i; } } if (potentially[min_idx] == INF + 1) break; one_color[min_idx] = potentially[min_idx]; potentially[min_idx] = INF + 1; int new_idx = min_idx; for (int i = 0; i < (int)one_color.size(); i++) { if (potentially[new_idx] != INF + 1 && one_color[i] + one_color[min_idx] < potentially[new_idx]) { potentially[new_idx] = one_color[i] + one_color[min_idx]; } new_idx++; if (new_idx >= m) new_idx -= m; } } return one_color; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, k, m; cin >> n >> k >> m; vector<jelly_bean> jelly_beans(n); unordered_set<int> colors; int n_i, k_i, m_i; for (int i = 0; i < n; i++) { cin >> n_i >> k_i >> m_i; jelly_beans[i] = {n_i, k_i, m_i}; colors.insert(n_i); } if (colors.size() != k) { cout << "0\n"; for (int i = 0; i < m - 1; i++) { cout << -1 << '\n'; } return 0; } sort(jelly_beans.begin(), jelly_beans.end()); vector<long long> one_color = knapsack(jelly_beans, k, m); one_color[0] = 0; vector<long long> prices = concat(one_color, m); for (int i = 0; i < m; i++) { cout << (prices[i] != INF ? prices[i] : -1) << '\n'; } return 0; } |
English