Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- using namespace std;
- const long long INF = 1e12;
- vector < vector < int > > v;
- int buy(int t, int k) {
- if(t < v[k][1]) return v[k][0] * t;
- else return v[k][2] * t;
- }
- int main() {
- int n, l;
- cin >> n >> l;
- v.resize(n, vector < int > (4));
- for(int i = 0; i < n; i++) cin >> v[i][0] >> v[i][1] >> v[i][2] >> v[i][3];
- int s = l, mx = 0;
- for(int i = 0; i < n; i++) {
- mx = max(mx, v[i][3]);
- }
- s += mx;
- cout << s << endl;
- vector < vector < int > > dp(s, vector < int > (n, INF));
- vector < vector < int > > b(s, vector < int > (n, INF));
- for(int i = 0; i < s; i++) {
- if(i < v[0][1]) dp[i][0] = v[0][0] * i;
- else dp[i][0] = v[0][2] * i;
- b[i][0] = i;
- }
- for(int i = 1; i < s; i++) {
- for(int j = 0; j < n; j++) {
- for(int t = 0; t < min(i, v[j][3]); t++) {
- if(buy(t, j) + dp[i - t][j - 1] < dp[i][j]) {
- dp[i][j] = min(dp[i][j], buy(t, j) + dp[i - t][j - 1]);
- b[i][j] = t;
- }
- }
- }
- }
- int ans = INF;
- int a;
- for(int i = l; i < s; i++) {
- if(dp[i][n - 1] < ans) {
- a = i;
- }
- ans = min(ans, dp[i][n - 1]);
- }
- cout << ans << endl;
- vector < int > out(n, 0);
- int i = n - 1;
- while(i != 0 && a != 0) {
- out[i] = b[a][i];
- i--;
- a -= b[a][i + 1];
- }
- for(int i = 0; i < n; i++) {
- cout << out[i] << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement