Pagini recente » Cod sursa (job #1710297) | Cod sursa (job #212028) | Cod sursa (job #138752) | Cod sursa (job #1992396) | Cod sursa (job #2051597)
#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 comp (lapte a, lapte b)
{
if (a.a == b.a) return a.b < b.b;
return a.a < b.a;
}
bool timp (int t)
{
bool r = 0;
for (j = 0; j <= l; j++)
{
v[1][j] = (t-j*a[1].a)/a[1].b;
p[1][j] = j;
}
for (i = 2; i <= n; i++)
{
v[i][0] = v[i-1][0] + t/a[i].b;
p[i][0] = 0;
for (j = 1; j <= l; j++)
{
mx = -1; in = 0;
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 && v[i-1][j-k] >= 0)
{
mx = nr;
in = k;
}
}
v[i][j] = mx;
p[i][j] = in;
}
}
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;
//sort (a+1, a+n+1, comp);
st = 1; dr = 20000;
while (st <= dr)
{
mid = st+(dr-st)/2;
k = timp(mid);
if (k == 1) dr = mid-1;
else st = mid+1;
}
while (timp(mid-1) == 1 && mid > 1) mid--;
while (timp(mid) == 0 && mid < 20000) mid++;
t = mid;
st = 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--)
{
fout << r[i] << " ";
fout << (t-r[i]*a[n-i+1].a)/a[n-i+1].b << "\n";
}
}