Cod sursa(job #29733)

Utilizator TheCreeepIonita Andrei Lucian TheCreeep Data 9 martie 2007 20:55:33
Problema Lapte Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 0.97 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<=L;i++) x[0][i]=-1000000;
	for(i=1;i<=n;++i)
	for(j=0;j<=L;++j)
	{
		max=0;
		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=0;
	b=100;
	do
	{
		m=(a+b)/2;
		if (try(m))
			b=m;
		else
			a=m;
	}
	while (b-a>1);

	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\n",y[i][j],z[i]);
		j=j-y[i][j];
	}
	for(i=1;i<=n;i++)
		fprintf(f,"%d %d\n",Z[i],z[i]);
	
	fclose(f);
	return 0;
}