Pagini recente » Cod sursa (job #1920156) | Cod sursa (job #240178) | Cod sursa (job #1888053) | Cod sursa (job #2279810) | Cod sursa (job #1297643)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("lapte.in");
ofstream g ("lapte.out");
const int NMAX = 128 + 1;
const int INF = 0x3fffffff;
int n, l;
int a[NMAX], b[NMAX], folosit[NMAX];
int cant[NMAX][NMAX], ant[NMAX][NMAX];
void citeste() {
f >> n >> l;
for (int i = 1; i <= n; i++)
f >> a[i] >> b[i];
}
bool ok(int timp) {
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= l; j++)
cant[i][j] = -INF;
cant[i][0] = 0;
}
int max_a;
for (int i = 1; i <= n; i++) {
max_a = timp / a[i];
for (int a_used = 0; a_used <= max_a; a_used++) {
int b_used = (timp - a_used * a[i]) / b[i];
for (int j = l; j >= a_used; j--)
if (cant[i][j] < cant[i - 1][j - a_used] + b_used) {
cant[i][j] = cant[i - 1][j - a_used] + b_used;
ant[i][j] = a_used;
}
}
}
return (cant[n][l] >= l);
}
void scrie(int timp) {
for (int a_used = l, i = n; i >= 1; a_used -= ant[i][a_used], i--)
folosit[i] = ant[i][a_used];
for (int i = 1; i <= n; i++)
g << folosit[i] << ' ' << (timp - a[i] * folosit[i]) / b[i] << '\n';
}
void rezolva() {
int m, st = 0, dr = 128, sol;
while (st <= dr) {
m = (st + dr) / 2;
if (ok(m)) {
sol = m;
dr = m - 1;
}
else st = m + 1;
}
g << sol << '\n';
ok(sol);
scrie(sol);
}
int main() {
citeste();
rezolva();
}