Pagini recente » Cod sursa (job #2734628) | Cod sursa (job #1744501) | Cod sursa (job #2175743) | Cod sursa (job #1862316) | Cod sursa (job #461232)
Cod sursa(job #461232)
#include <stdio.h>
int n, l, sol;
struct vect
{
int a, b;
} v[102], rez[102];
int pred[102][102];
int exista (int timp)
{
int d[102][102];
for (int i = 0; i <= n; i ++)
for (int j = 0; j <= l; j ++)
d[i][j] = -1000000000;
d[0][0] = 0;
for (int i = 1; i <= n; i ++)
{
d[i][0] = 0;
for (int j = 0; j <= l; j ++)
for (int k = 0; k <= j && k <= timp / v[i].a; k ++)
{
if (d[i][j] < d[i - 1][j - k] + (timp - k * v[i].a) / v[i].b && d[i - 1][j - k] != -1000000000)
d[i][j] = d[i - 1][j - k] + (timp - k * v[i].a) / v[i].b;
pred[i][j] = k;
}
}
return d[n][l] >= l;
}
int main ()
{
freopen ("lapte.in", "r", stdin);
freopen ("lapte.out", "w", stdout);
scanf ("%d %d", &n, &l);
for (int i = 1; i <= n; i ++)
scanf ("%d %d", &v[i].a, &v[i].b);
int st = 0, dr = 100, m;
while (st <= dr)
{
m = (st + dr) >> 1;
if (exista (m))
{
sol = m;
dr = m - 1;
}
else
st = m + 1;
}
exista (sol);
for (int i = n; i; i --)
{
rez[i].a = pred[i][l];
l -= rez[i].a;
rez[i].b = (sol - rez[i].a * v[i].a) / v[i].b;
}
printf ("%d\n", sol);
for (int i = 1; i <= n; i ++)
printf ("%d %d\n", rez[i].a, rez[i].b);
return 0;
}