Cod sursa(job #215936)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n, l, b[101], a[101], c[101][101];
typedef struct
{
int y, a, b;
} Laptar;
Laptar r[101][101];
int min(int x, int y) { return x < y ? x : y;}
int max(int x, int y) { return x > y ? x : y;}
void citire()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d %d", &n, &l);
int i;
for (i=1; i<=n; i++)
scanf("%d %d",&a[i], &b[i]);
}
int verif(int T)
{
int i, j, k;
j = 0;
while (j * a[1] <= T)
{
c[1][j] = (T - (j * a[1])) / b[1];
r[1][j].y = 0;
r[1][j].a = j;
r[1][j].b = (T - (j * a[1])) / b[1];
j++;
}
for (i = 2; i <= n; i++)
for (j = 0; j <= l; j++)
{
int maxim = 0;
for (k = 0; k * a[i] <= T; k++)
if (maxim < c[i - 1][j - k] + (T - a[i] * k) / b[i])
{
maxim = c[i - 1][j - k] + (T - a[i] * k) / b[i];
r[i][j].y = j - k;
r[i][j].a = k;
r[i][j].b = (T - a[i] * k) / b[i];
}
c[i][j] = maxim;
if (j >= l && maxim >= l) return 1;
}
return 0;
}
int search()
{
int p, u, m;
p = 1; u =30;
while (p <= u)
{
m = (p + u) / 2;
if (verif(m) && !verif(m - 1)) return m;
else if (verif(m - 1)) u = m - 1;
else if (!verif(m)) p = m + 1;
}
return 0;
}
void reconst(int x, int y)
{
if (x > 0)
{
reconst(x - 1, r[x][y].y);
printf("%d %d\n",r[x][y].a,r[x][y].b);
}
}
int main()
{
citire();
int rez = search();
verif(rez);
printf("%d\n",rez);
reconst(n,l);
return 0;
}