Pagini recente » Cod sursa (job #1931503) | Cod sursa (job #2806934) | Cod sursa (job #416656) | Cod sursa (job #1488368) | Cod sursa (job #1892253)
#include <cstdio>
#define MAX 100
int d[MAX+1][2*MAX+1], a[MAX+1], b[MAX+1], last, l, n, r[MAX+1][2*MAX+1];
inline int dinamica(int t)
{
int i, j, k, f=0;
for(j=0;j<=n;++j)
for(i=0;i<=2*l;++i)
d[j][i]=-1, r[j][i]=-1;
d[0][0]=0;
for(i=1;i<=n;++i)
for(j=0;j<=2*l;++j)
for(k=0;k<=j && t-k*a[i]>=0;++k)
if(d[i-1][j-k] > -1 && d[i][j] < d[i-1][j-k]+(t-k*a[i])/b[i])
{
d[i][j]=d[i-1][j-k]+(t-k*a[i])/b[i];
r[i][j]=j-k;
}
for(i=l;i<=2*l && !f;++i)
if(d[n][i] >= l)
f=i;
return f;
}
void afisare(int lin, int col)
{
int x, y;
if(r[lin][col]!=-1 && lin-1>=1)
afisare(lin-1, r[lin][col]);
x=col-r[lin][col];
y=(last-(x*a[lin]))/b[lin];
printf("%d %d\n", x, y);
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
int i, st, dr, m, sol;
scanf("%d%d", &n, &l);
for(i=1;i<=n;++i)
scanf("%d%d", &a[i], &b[i]);
st=1, dr=MAX;
while(st<=dr)
{
m=(st+dr)/2;
if(dinamica(m))
{
last=m;
dr=m-1;
}
else st=m+1;
}
sol=dinamica(last);
printf("%d\n", last);
afisare(n, sol);
return 0;
}