Cod sursa(job #29776)

Utilizator TheCreeepIonita Andrei Lucian TheCreeep Data 9 martie 2007 22:18:44
Problema Lapte Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>
int L,n;
int A[101],B[101],z[101],Z[101];
int x[101][101],y[101][101];
FILE *f;
int try (int T)
{
	int i,j,max,maxi,t,tmp;
	for(i=1;i<=100;i++) x[0][i]=-10000000;

	for(i=1;i<=n;++i)
	for(j=0;j<=L;++j)
	{
		max=-1000000;
		maxi=0;
		for(t=0;t<=j;t++)
		if (t*A[i]<=T)
		{
			tmp=(T-t*A[i])/B[i]+x[i-1][j-t]; 
			if (tmp>=max) 
			{
//				printf("%d %d %d %d\n",i,j,t,tmp);
				max=tmp;
				maxi=t;
			}
		}
		x[i][j]=max;
		y[i][j]=maxi;
		

	}	
	if (x[n][L]>=L) return 1;
	return 0;
}
int main (void)
{
	int i,a,b,m,j;
	f=fopen("lapte.in","r");
	fscanf(f,"%d %d",&n,&L);
	for(i=1;i<=n;i++)	
		fscanf(f,"%d %d",&A[i],&B[i]);
	fclose(f);

	a=-1;
	b=100;
	do
	{
		m=(a+b)/2;
		if (try(m))
			b=m;
		else
			a=m;
	}
	while (b-a>1);
	if (b==100) try(b);
	f=fopen("lapte.out","w");
	fprintf(f,"%d\n",b);
	j=L;
	for(i=n;i>=1;i--)
	{
		z[i]=(b-A[i]*y[i][j])/B[i];
		Z[i]=y[i][j];
//		fprintf(f,"%d %d %d %d\n",y[i][j],z[i],j,j-y[i][j]);
		j=j-y[i][j];
	}
	for(i=1;i<=n;i++)
		fprintf(f,"%d %d\n",Z[i],z[i]);
	
	fclose(f);
	return 0;
}