Pagini recente » Cod sursa (job #2050851) | Cod sursa (job #2082069) | Cod sursa (job #398705) | Cod sursa (job #1767625) | Cod sursa (job #838437)
Cod sursa(job #838437)
#include<stdio.h>
int d[102][102],n,l,tmin;
struct tip
{
int a,b;
}sol[102],v[102];
void citire()
{
freopen("lapte.in","r",stdin);
scanf("%d %d",&n,&l);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&v[i].a,&v[i].b);
}
}
int verif(int t)
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=l;j++)
{
d[i][j]=-1;
}
}
d[0][0]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=l;j++)
{
for(int k=0;k<=j && k*v[i].a<=t;k++)
{
if(d[i-1][j-k]!=-1 && d[i][j]<d[i-1][j-k]+(t-k*v[i].a)/v[i].b)
{
d[i][j]=d[i-1][j-k]+(t-k*v[i].a)/v[i].b;
}
}
}
}
if(d[n][l]>=l)
return 1;
return 0;
}
void cauta()
{
int p=1,u=100,m;
while(p<=u)
{
m=(p+u)/2;
if(verif(m))
{
u=m-1;
tmin=m;
}
else
{
p=m+1;
}
}
}
void reconst(int t)
{
int ok=verif(t),j=l;
for(int i=n;i>=1;i--)
{
for(int k=0;k<=j && k*v[i].a<=t;k++)
{
if(d[i][j]==d[i-1][j-k]+(t-k*v[i].a)/v[i].b)
{
j=j-k;
sol[i].a=k;
sol[i].b=(t-k*v[i].a)/v[i].b;
break;
}
}
}
}
void afisare()
{
for(int i=1;i<=n;i++)
{
printf("\n%d %d",sol[i].a,sol[i].b);
}
}
int main()
{
citire();
cauta();
freopen("lapte.out","w",stdout);
printf("%d",tmin);
reconst(tmin);
afisare();
return 0;
}