#include<bits/stdc++.h> using namespace std; const long long MAXV=2e18; int n,m,k; vector<int>stosy[7005]; int main() { ios_base::sync_with_stdio(0); cin>>n>>k>>m; vector<long long> masa(n+5),cena(n+5); for(int i=0; i<n; i++){ int kol; cin>>kol>>masa[i]>>cena[i]; stosy[kol].push_back(i); } long long t[2][m]; for(int i=0; i<m; i++){ t[0][i]=t[1][i]=MAXV; } t[0][0]=0; for(int i=1;i<=k;i++) { for(int j=0; j<m; j++) { t[i&1][j]=MAXV; } for(auto x : stosy[i]) { for(int j=0; j<m; j++) { if(t[(i+1)&1][j]!=MAXV) { t[i&1][(j+masa[x])%m]=min(t[i&1][(j+masa[x])%m],t[(i+1)&1][j]+cena[x]); } } } } vector<pair<int,long long>>edges; for(int i=0;i<m;i++){ if(t[k&1][i]!=MAXV){ edges.push_back({i,t[k&1][i]}); } } //cout<<edges.size()<<"\n"; // for(auto x:edges){ // cout<<x.first<<" "<<x.second<<"\n"; // } vector<long long>odl(m,MAXV); vector<bool>odw(m,0); odl[0]=0; int currv=0; for(int i=0;i<m;i++) { odw[currv]=1; for(auto x : edges) { odl[(currv+x.first)%m]=min(odl[(currv+x.first)%m],odl[currv]+x.second); } int cand=-1; long long candodl=MAXV; for(int j=0;j<m;j++){ if(!odw[j]&&odl[j]<candodl){ cand=j; candodl=odl[j]; } } currv=cand; if(cand==-1) break; } for(int i=0;i<m;i++){ if(odl[i]==MAXV){ cout<<"-1\n"; } else{ cout<<odl[i]<<"\n"; } } }
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 | #include<bits/stdc++.h> using namespace std; const long long MAXV=2e18; int n,m,k; vector<int>stosy[7005]; int main() { ios_base::sync_with_stdio(0); cin>>n>>k>>m; vector<long long> masa(n+5),cena(n+5); for(int i=0; i<n; i++){ int kol; cin>>kol>>masa[i]>>cena[i]; stosy[kol].push_back(i); } long long t[2][m]; for(int i=0; i<m; i++){ t[0][i]=t[1][i]=MAXV; } t[0][0]=0; for(int i=1;i<=k;i++) { for(int j=0; j<m; j++) { t[i&1][j]=MAXV; } for(auto x : stosy[i]) { for(int j=0; j<m; j++) { if(t[(i+1)&1][j]!=MAXV) { t[i&1][(j+masa[x])%m]=min(t[i&1][(j+masa[x])%m],t[(i+1)&1][j]+cena[x]); } } } } vector<pair<int,long long>>edges; for(int i=0;i<m;i++){ if(t[k&1][i]!=MAXV){ edges.push_back({i,t[k&1][i]}); } } //cout<<edges.size()<<"\n"; // for(auto x:edges){ // cout<<x.first<<" "<<x.second<<"\n"; // } vector<long long>odl(m,MAXV); vector<bool>odw(m,0); odl[0]=0; int currv=0; for(int i=0;i<m;i++) { odw[currv]=1; for(auto x : edges) { odl[(currv+x.first)%m]=min(odl[(currv+x.first)%m],odl[currv]+x.second); } int cand=-1; long long candodl=MAXV; for(int j=0;j<m;j++){ if(!odw[j]&&odl[j]<candodl){ cand=j; candodl=odl[j]; } } currv=cand; if(cand==-1) break; } for(int i=0;i<m;i++){ if(odl[i]==MAXV){ cout<<"-1\n"; } else{ cout<<odl[i]<<"\n"; } } } |