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 < long long > > v;
- long long buy(long long t, long long k) {
- if(t < v[k][1]) return v[k][0] * t;
- else return v[k][2] * t;
- }
- int main() {
- long long n, l;
- cin >> n >> l;
- v.resize(n, vector < long long > (4));
- for(long long i = 0; i < n; i++) cin >> v[i][0] >> v[i][1] >> v[i][2] >> v[i][3];
- long long s = l, mx = 0;
- for(long long i = 0; i < n; i++) {
- mx = max(mx, v[i][3]);
- }
- s += mx + 10;
- cout << s << endl;
- vector < vector < long long > > dp(s + 1, vector < long long > (n, INF));
- vector < vector < long long > > b(s + 1, vector < long long > (n, INF));
- for(long long 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(long long i = 0; i <= s; i++) {
- for(long long j = 1; j < n; j++) {
- for(long long t = 0; t <= min(i, v[j][3]); t++) {
- cout << t << " ";
- if(buy(t, j) + dp[i - t][j - 1] < dp[i][j]) {
- dp[i][j] = buy(t, j) + dp[i - t][j - 1];
- b[i][j] = t;
- }
- }
- cout << endl;
- }
- }
- long long ans = INF;
- long long a;
- for(long long i = l; i <= s; i++) {
- if(dp[i][n - 1] < ans) {
- a = i;
- ans = dp[i][n - 1];
- }
- }
- cout << a << " " << ans << endl;
- vector < long long > out(n, 0);
- long long i = n - 1;
- while(i != -1 && a != 0) {
- out[i] = b[a][i];
- cout << out[i] << " ";
- i--;
- a -= b[a][i + 1];
- }
- for(long long i = 0; i < n; i++) {
- cout << out[i] << " ";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement