#include<bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> PII; constexpr int M = 7e3+7; constexpr int inf = 1e18; int n, k, m; vector<PII> zelek[M]; int dp[M][M];//dp[i][j]-koszt uzyskania multizbioru z reszta j, przy czym i to ile jest zelkow kazdego koloru void init(){ for(int i=0; i<=m; i++){ for(int j=0; j<=m; j++){ dp[i][j] = inf; } } dp[0][0] = 0; } void update(int i, int j){ for(int tmp=0; tmp<m; tmp++){ int act = tmp+j; if(act >= m) act -= m; dp[i][act] = min(dp[i][act], dp[i-1][tmp]+dp[1][j]); } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> m; init(); for(int i=1; i<=n; i++){ int ak, am, ac; cin >> ak >> am >> ac; zelek[ak].push_back({am,ac}); } //liczenie jak zrobic dp[1][reszta] - O(n^2) vector<int> before(m,inf), act(m,inf); before[0] = 0; for(int i=1; i<=k; i++){ for(auto j : zelek[i]){ int masa = j.first, cena = j.second; for(int l=0; l<m; l++){ act[(l+masa)%m] = min(act[(l+masa)%m], before[l]+cena); } } swap(before, act); fill(act.begin(), act.end(), inf); } for(int i=0; i<m; i++) dp[1][i] = before[i]; int st = 5e8 / (m*m); for(int i=2; i<=min(m,st); i++){ for(int j=0; j<m; j++){ update(i,j); } } cout << 0 << '\n'; for(int j=1; j<m; j++){ int res = inf; for(int i=1; i<=m; i++){ res = min(res, dp[i][j]); } if(res == inf) cout << -1 << '\n'; else cout << res << '\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 | #include<bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> PII; constexpr int M = 7e3+7; constexpr int inf = 1e18; int n, k, m; vector<PII> zelek[M]; int dp[M][M];//dp[i][j]-koszt uzyskania multizbioru z reszta j, przy czym i to ile jest zelkow kazdego koloru void init(){ for(int i=0; i<=m; i++){ for(int j=0; j<=m; j++){ dp[i][j] = inf; } } dp[0][0] = 0; } void update(int i, int j){ for(int tmp=0; tmp<m; tmp++){ int act = tmp+j; if(act >= m) act -= m; dp[i][act] = min(dp[i][act], dp[i-1][tmp]+dp[1][j]); } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> k >> m; init(); for(int i=1; i<=n; i++){ int ak, am, ac; cin >> ak >> am >> ac; zelek[ak].push_back({am,ac}); } //liczenie jak zrobic dp[1][reszta] - O(n^2) vector<int> before(m,inf), act(m,inf); before[0] = 0; for(int i=1; i<=k; i++){ for(auto j : zelek[i]){ int masa = j.first, cena = j.second; for(int l=0; l<m; l++){ act[(l+masa)%m] = min(act[(l+masa)%m], before[l]+cena); } } swap(before, act); fill(act.begin(), act.end(), inf); } for(int i=0; i<m; i++) dp[1][i] = before[i]; int st = 5e8 / (m*m); for(int i=2; i<=min(m,st); i++){ for(int j=0; j<m; j++){ update(i,j); } } cout << 0 << '\n'; for(int j=1; j<m; j++){ int res = inf; for(int i=1; i<=m; i++){ res = min(res, dp[i][j]); } if(res == inf) cout << -1 << '\n'; else cout << res << '\n'; } return 0; } |