Pagini recente » Cod sursa (job #251749) | Cod sursa (job #1292889) | Monitorul de evaluare | Cod sursa (job #867508) | Cod sursa (job #83869)
Cod sursa(job #83869)
#include <cstdio>
#include <cstring>
#define NMAX 105
int N,L,TT=101;
short int A[NMAX],B[NMAX];
short int best[NMAX][NMAX];
short int last[NMAX][NMAX];
short int sol[NMAX][NMAX];
void read_data()
{
scanf("%d %d",&N,&L);
for(int i=0;i<N;i++)
scanf("%hd %hd",&A[i],&B[i]);
}
int verif(int T)
{
int i,j,k,max;
for(i=0;i<N;i++)
for(j=0;j<=L;j++)
{
best[i][j]=0;
last[i][j]=-1;
for(k=0;(k<=j)&&(k*A[i]<=T);k++)
{
if(i==0)
{
max = 0;
if(k==j)
max += (T-j*A[i])/B[i];
}
else
{
max = best[i-1][j-k];
max += (T-k*A[i])/B[i];
}
if(best[i][j]<max)
{
best[i][j]=max;
last[i][j]=k;
}
}
}
if(best[N-1][L]>=L)
{
if(TT>T)
{
TT=T;
memcpy(sol,last,sizeof(last));
}
return true;
}
else
return false;
}
int binsearch(int li, int ls)
{
if(li>ls)
return -1;
if(verif((li+ls)/2))
{
int aux=binsearch(li,(li+ls)/2-1);
return (aux==-1)?(li+ls)/2:aux;
}
else
return binsearch((li+ls)/2+1,ls);
}
void write_sol(int N, int L)
{
if(N>0)
write_sol(N-1,L-sol[N][L]);
printf("%d %d\n",sol[N][L],(TT-sol[N][L]*A[N])/B[N]);
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
read_data();
printf("%d\n",binsearch(1,100));
write_sol(N-1,L);
return 0;
}