Pagini recente » Cod sursa (job #1361817) | Cod sursa (job #280023) | Cod sursa (job #2249328) | Cod sursa (job #2880524) | Cod sursa (job #827290)
Cod sursa(job #827290)
#include <cstdio>
#include <cstring>
using namespace std;
int a[105];
int b[105];
int N,L;
int d[105][105];
int sola[105];
int solb[105];
int m[105][105];
inline int max(int a,int b)
{
if(a>b)
return a;
return b;
}
bool ok(int T)
{
int i,j,k;
memset(d,-1,105*105*4);
d[0][0] = 0;
for(i=1;i<=N;++i)
{
for(j=0;j<=L;++j)
{
for(k=0;k<= T/a[i] && k <= j;++k)
{
if(d[i-1][j-k] != -1)
d[i][j] = max(d[i][j],d[i-1][j-k] + (T-k*a[i])/b[i]);
}
}
}
return d[N][L] >= L;
}
void rebuild(int cr)
{
memset(d,-1,105*105*4);
d[0][0] = 0;
int i,j,k;
for(i=1;i<=N;++i)
{
for(j=0;j<=L;++j)
{
for(k=0;k*a[i] <= cr && k <= j;++k)
if(d[i-1][j-k]!= -1 && d[i][j] < d[i-1][j-k] + (cr - a[i] * k)/b[i])
{
d[i][j] = d[i-1][j-k] + (cr-a[i]*k)/b[i];
m[i][j] = k;
}
}
}
for(j=L,i=N;i>=1;--i)
{
sola[i] = m[i][j];
solb[i] = (cr-m[i][j] * a[i])/b[i];
j-=m[i][j];
}
for(i=1;i<=N;++i)
printf("%d %d\n",sola[i],solb[i]);
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
setvbuf(stdin,NULL,_IOFBF,1024);
int i;
scanf("%d%d",&N,&L);
for(i=1;i<=N;++i)
scanf("%d %d",a+i,b+i);
int step = 128,cr = 105;
for(;step;step>>=1)
if(cr - step && ok(cr-step))
cr-=step;
printf("%d\n",cr);
rebuild(cr);
return 0;
}