#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int mx = 7002;
const long long INFINITY = 9223372036854775807;
int n, k, m, color, weight;
long long price;
struct food{
int weight;
long long price;
};
vector<food> foods[mx];
vector<food>edges;
long long backpack[mx][mx];
long long dist[mx];
bool is_visited[mx];
priority_queue<pair<long long,int>> pq;
int main(){
ios::sync_with_stdio(false);
cin >> n >> k >> m;
for(int i = 0; i < n; ++i){
cin >> color >> weight >> price;
foods[color].push_back({weight, price});
}
backpack[0][0] = 0;
for(int i = 1; i < m; ++i){
backpack[0][i] = INFINITY;
}
for(int i = 1; i <= k; ++i){
if(foods[i].empty()){
cout << 0 << "\n";
for(int j = 1; j < m; ++j){
cout << -1 << "\n";
}
return 0;
}
for(int j = 0; j < m; ++j){
backpack[i][j] = INFINITY;
}
for(int j = 0; j < foods[i].size(); ++j){
weight = foods[i][j].weight;
price = foods[i][j].price;
for(int t = 0; t < m; ++t){
if(backpack[i-1][t] != INFINITY){
int new_weight = (t + weight) % m;
long long new_price = backpack[i-1][t] + price;
backpack[i][new_weight] = min(backpack[i][new_weight], new_price);
}
}
}
}
for(int i = 1; i < m; ++i){
if(backpack[k][i] != INFINITY){
edges.push_back({i, backpack[k][i]});
}
}
for(int i = 1; i < m; ++i){
dist[i] = INFINITY;
}
pq.push({0, 0});
while(!pq.empty()){
auto actual = pq.top();
pq.pop();
price = -actual.first;
weight = actual.second;
is_visited[weight] = true;
for(int i = 0; i < edges.size(); ++i){
int new_weight = (weight + edges[i].weight) % m;
if(!is_visited[new_weight]){
long long new_price = price + edges[i].price;
if(new_price < dist[new_weight]){
dist[new_weight] = new_price;
pq.push({-new_price, new_weight});
}
}
}
}
for(int i = 0; i < m; ++i){
if(dist[i] == INFINITY)
cout << -1 << "\n";
else
cout << dist[i] << "\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 | #include <iostream> #include <vector> #include <queue> using namespace std; const int mx = 7002; const long long INFINITY = 9223372036854775807; int n, k, m, color, weight; long long price; struct food{ int weight; long long price; }; vector<food> foods[mx]; vector<food>edges; long long backpack[mx][mx]; long long dist[mx]; bool is_visited[mx]; priority_queue<pair<long long,int>> pq; int main(){ ios::sync_with_stdio(false); cin >> n >> k >> m; for(int i = 0; i < n; ++i){ cin >> color >> weight >> price; foods[color].push_back({weight, price}); } backpack[0][0] = 0; for(int i = 1; i < m; ++i){ backpack[0][i] = INFINITY; } for(int i = 1; i <= k; ++i){ if(foods[i].empty()){ cout << 0 << "\n"; for(int j = 1; j < m; ++j){ cout << -1 << "\n"; } return 0; } for(int j = 0; j < m; ++j){ backpack[i][j] = INFINITY; } for(int j = 0; j < foods[i].size(); ++j){ weight = foods[i][j].weight; price = foods[i][j].price; for(int t = 0; t < m; ++t){ if(backpack[i-1][t] != INFINITY){ int new_weight = (t + weight) % m; long long new_price = backpack[i-1][t] + price; backpack[i][new_weight] = min(backpack[i][new_weight], new_price); } } } } for(int i = 1; i < m; ++i){ if(backpack[k][i] != INFINITY){ edges.push_back({i, backpack[k][i]}); } } for(int i = 1; i < m; ++i){ dist[i] = INFINITY; } pq.push({0, 0}); while(!pq.empty()){ auto actual = pq.top(); pq.pop(); price = -actual.first; weight = actual.second; is_visited[weight] = true; for(int i = 0; i < edges.size(); ++i){ int new_weight = (weight + edges[i].weight) % m; if(!is_visited[new_weight]){ long long new_price = price + edges[i].price; if(new_price < dist[new_weight]){ dist[new_weight] = new_price; pq.push({-new_price, new_weight}); } } } } for(int i = 0; i < m; ++i){ if(dist[i] == INFINITY) cout << -1 << "\n"; else cout << dist[i] << "\n"; } return 0; } |
English