Pagini recente » Cod sursa (job #2492734) | Cod sursa (job #730922) | Cod sursa (job #1158590) | Cod sursa (job #1537374) | Cod sursa (job #3257138)
#include <iostream>
#include <fstream>
#include <vector>
#include <climits>
//#include <bits/stdc++.h>
#define in fin
#define out fout
#define oo INT_MAX
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, L; in >> n >> L;
int A[n + 1], B[n + 1];
for(int i = 1; i <= n; i++) in >> A[i] >> B[i];
int l = 1, r = 1000000000; // pt timp
int sol = 0;
while(l <= r){
int t = (l + r) / 2;
int dp[n + 1][105];
for(int i = 0; i <= n; i++){
for(int j = 0; j <= 100; j++) dp[i][j] = -1;
}
// for(int a = 0; a <= L; a++){
// for(int x = 0; x <= a; x++){
// dp[0][a] = max(dp[0][a], (t - x * A[0]) / B[0]);
// if(t == 17) cout << "a = " << a << " x = " << x << " facem b = " << (t - x * A[0]) / B[0] << '\n';
// }
// }
dp[0][0] = 0;
for(int i = 1; i <= n; i++){
for(int a = 0; a <= L; a++){
for(int x = 0; x <= a && x * A[i] <= t; x++){
// if(t < 20) cout << "daca la " << i << " bem " << x << " lapte primim " << (t - x * A[i]) / B[i] << " litri de B\n";
int add = (t - A[i] * x) / B[i];
// if(add < 0) add = 0;
if(dp[i - 1][a - x] >= 0 && dp[i - 1][a - x] + add > dp[i][a]){
dp[i][a] = dp[i - 1][a - x] + add;
// if(a == L && t == 18){
// cout << "vine " << dp[i][a] << " din " << i - 1 << " , " << a - x << " + " << add << " x = " << x << '\n';
// }
}
}
}
}
// if(t <= 20){
// // cout << "t = " << t << " dp : " << dp[n][L] << '\n';
// for(int i = 1; i <= n; i++){
// for(int j = 0; j <= L; j++) cout << dp[i][j] << " ";
// cout << '\n';
// }
// }
// cout << "t = " << t << " l = " << l << " r = " << r << '\n';
if(dp[n][L] >= L){
sol = t;
r = t - 1;
}else l = t + 1;
}
int dp[n + 1][105];
for(int i = 0; i <= n; i++){
for(int j = 0; j <= 100; j++) dp[i][j] = -1;
}
dp[0][0] = 0;
int solA[n + 1][105], solB[n + 1][105];
for(int i = 1; i <= n; i++){
for(int a = 0; a <= L; a++){
for(int x = 0; x <= a && x * A[i] <= sol; x++){
// if(t < 20) cout << "daca la " << i << " bem " << x << " lapte primim " << (t - x * A[i]) / B[i] << " litri de B\n";
int add = (sol - A[i] * x) / B[i];
// if(add < 0) add = 0;
if(dp[i - 1][a - x] >= 0 && dp[i - 1][a - x] + add > dp[i][a]){
dp[i][a] = dp[i - 1][a - x] + add;
solA[i][a] = x;
solB[i][a] = add;
// cout << "vine " << dp[i][a] << " din " << i - 1 << " , " << a - x << " + " << add << " x = " << x << '\n';
}
}
}
}
out << sol << '\n';
int a = L;
vector< pair<int, int> > sl;
for(int i = n; i >= 1; i--){
sl.push_back( make_pair( solA[i][a], solB[i][a] ) );
a -= solA[i][a];
}
reverse(sl.begin(), sl.end());
for(int i = 0; i < sl.size(); i++) out << sl[i].first << " " << sl[i].second << '\n';
return 0;
}