Pagini recente » Cod sursa (job #111214) | Cod sursa (job #2308262) | Cod sursa (job #2914744) | Cod sursa (job #496472) | Cod sursa (job #3257223)
#include <fstream>
#include <stack>
using namespace std;
const int NMAX = 100;
const int INF = 21e8;
ifstream cin("lapte.in");
ofstream cout("lapte.out");
int a[NMAX + 2], b[NMAX + 2];
int n, l;
int dp[NMAX + 2][NMAX + 2]; ///in primii i oameni, maxL B dc s-au baut j L de A
int ult[NMAX + 2][NMAX + 2]; ///dir din care 'vine' (nr la CARE am adaugat lapte)
void print() {
for(int i = 1; i <= n; i++) {
for(int j = 0; j <= l; j++) {
cout << dp[i][j] << " ";
}
cout << '\n';
}
cout << '\n';
}
void init() {
for(int i = 0; i <= n; i++) { ///ca sa NU ne ia ans-urile alea drept bune
for(int j = 0; j <= NMAX; j++) {
dp[i][j] = -INF; ///mai safe si merge dc pt TOATA mat
}
}
dp[0][0] = 0;
}
bool check(int t) {
init();
for(int i = 1; i <= n; i++) { ///prin fiec elem
for(int A = 0; A <= NMAX; A++) { ///cati L de A s-au baut deja
for(int x = 0; x * a[i] <= t; x++) { ///cati L de A bea omu nostru
int y = (t - x * a[i]) / b[i]; ///am adaugat si x si y (pe nextR)
if(A + x <= l) {
if(dp[i - 1][A] + y > dp[i][A + x]) {
dp[i][A + x] = dp[i - 1][A] + y;
ult[i][A + x] = A; ///care era INAINTE
}
}
}
}
}
//print();
return (dp[n][l] >= l);
}
stack <pair <int, int>> sol; ///a, b
int main()
{
int maxx = 0;
cin >> n >> l;
for(int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
maxx = max(maxx, (a[i] + b[i]) * l);
}
int st = 0, dr = maxx, ans = maxx;
while(st <= dr) {
int mid = (st + dr) / 2;
if(check(mid)) {
//cout << "yeee " << mid << '\n';
ans = mid;
dr = mid - 1;
}
else
st = mid + 1;
}
cout << ans << '\n';
check(ans);
int i = n, j = l;
while(i != 0 || j != 0) {
int dir = ult[i][j]; ///noul A,care va fi
int difb = dp[i][j] - dp[i - 1][dir];
sol.push({j - dir, difb});
i--;
j = dir;
}
while(!sol.empty()) {
cout << sol.top().first << " " << sol.top().second << '\n';
sol.pop();
}
return 0;
}