Cod sursa(job #356031)

Utilizator proflaurianPanaete Adrian proflaurian Data 13 octombrie 2009 11:06:35
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
int N,L,ti,ts,tm,CA,TA,CB,TB,U,R,i,j,a;
int A[101],B[101],sa[101],sb[101],
mb[101][101],ca[101][101],cb[101][101];
void read(),solve(),dinamica();
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	scanf("%d%d",&N,&L);
	for(i=1;i<=N;i++)scanf("%d%d",&A[i],&B[i]);
	for(j=1;j<=L;j++)mb[0][j]=-1;
}
void solve()
{
	for(ti=0,ts=101;ts-ti-1;)dinamica();
	printf("%d\n",ts);
	for(i=1;i<=U;i++)printf("%d %d\n",sa[i],sb[i]);
	for(i=U+1;i<=N;i++)printf("0 0\n");
}
void dinamica()
{
	tm=(ti+ts)/2;
	for(i=1;i<=N;i++)
	{
		for(j=0;j<=L;j++){mb[i][j]=mb[i-1][j];ca[i][j]=cb[i][j]=0;}
		for(CA=0;;CA++)
		{
			TA=CA*A[i];
			if(TA>tm)break;
			TB=tm-TA;
			CB=TB/B[i];
			for(a=0;;a++)
			{
				if(a+CA>L)break;
				if(mb[i-1][a]==-1)continue;
				if(mb[i][a+CA]>=mb[i-1][a]+CB)continue;
				mb[i][a+CA]=mb[i-1][a]+CB;
				ca[i][a+CA]=CA;
				cb[i][a+CA]=CB;
			}
			if(mb[i][L]>=L)
			{
				U=i;R=L;
				for(i=U;i>=1;i--)
				{
					sa[i]=ca[i][R];
					sb[i]=cb[i][R];
					R-=sa[i];
				}
				ts=tm;
				return;
			}					
		}
	}
	ti=tm;
}