Cod sursa(job #216665)
#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;
for (i = 0; i <= n; i++)
for (j = 0; j <= l; j++) c[i][j] = 0;
for (i = 1; i <= n; i++)
for (j = 0; j <= l; j++)
{
int maxim = 0;
for (k = 0; ((k * a[i]) <= T) && ((j - k) >= 0); 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 (c[n][l] > l) return 1;
return 0;
}
int search()
{
int p, u, m;
p = 1; u = 100;
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;
}