Pagini recente » Cod sursa (job #1112645) | Cod sursa (job #1694238) | Cod sursa (job #1132443) | Cod sursa (job #1761570) | Cod sursa (job #2051570)
#include <iostream>
#include <fstream>
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, l, i, j, k, t, nr, mx, in, v[110][110], p[110][110];
int st, dr, mid, x, y, r[110], rz;
struct lapte
{ int a, b; } a[110];
bool timp (int t)
{
bool r = 0;
for (int j = 0; j <= l; j++)
{
v[1][j] = (t-j*a[1].a)/a[1].b;
if (v[1][j] < 0) v[1][j] = 0;
}
for (int i = 2; i <= n; i++)
{
v[i][0] = v[i-1][0] + t/a[i].b;
for (j = 1; j <= l; j++)
{
mx = -l;
for (int k = 0; k <= j; k++)
{
nr = (t-k*a[i].a)/a[i].b + v[i-1][j-k];
if (nr > mx && t >= k*a[i].a)
mx = nr;
}
if (mx != -l) v[i][j] = mx;
}
}
if (v[n][l] >= l) r = 1;
return r;
}
int main () {
fin >> n >> l;
for (i = 1; i <= n; i++)
fin >> a[i].a >> a[i].b;
st = 1; dr = 20000;
while (st <= dr)
{
mid = st+(dr-st)/2;
rz = timp(mid);
if (rz == 1) dr = mid-1;
else st = mid+1;
}
if (timp(mid-1) == 1 && mid > 1) mid--;
if (timp(mid) == 0 && mid < 20000) mid++;
t = mid;
for (j = 0; j <= l; j++)
{
v[1][j] = (t-j*a[1].a)/a[1].b;
if (v[1][j] < 0) v[1][j] = 0;
p[1][j] = j;
}
for (i = 2; i <= n; i++)
{
v[i][0] = v[i-1][0] + t/a[i].b;
for (j = 1; j <= l; j++)
{
mx = -l;
for (k = 0; k <= j; k++)
{
nr = (t-k*a[i].a)/a[i].b + v[i-1][j-k];
if (nr > mx && t >= k*a[i].a)
{
mx = nr;
in = k;
}
}
if (mx != -l)
{
v[i][j] = mx;
p[i][j] = in;
}
}
}
st = 0; rz = 0;
x = n; y = l;
while (x > 1)
{
rz++; r[rz] = p[x][y];
st += p[x][y];
y -= p[x][y]; x--;
}
rz++; r[rz] = l-st;
fout << t << "\n";
for (i = rz; i >= 1; i--)
{
x = r[i];
fout << r[i] << " ";
fout << (t-r[i]*a[n-i+1].a)/a[n-i+1].b << "\n";
}
}