Cod sursa(job #204144)

Utilizator devilkindSavin Tiberiu devilkind Data 22 august 2008 11:29:19
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
#include <string.h>

#define NMAX 128

int din[NMAX][NMAX];
int bA[NMAX][NMAX];
int N,L;
int v[NMAX][2];

int compute(int T)
{
	int i,j,k,x;

	memset(din,0,sizeof(din));
	memset(bA,0,sizeof(bA));

	for (i=0;i<=L;i++)
		din[1][i]=(T-i*v[1][0])/v[1][1];

	for (i=2;i<=N;i++)
		for (j=0;j<=L;j++)
			for (k=0,din[i][j]=-1;k<=j;k++)
			{
				if (k*v[i][0]>T) break;

				x=(T-k*v[i][0])/v[i][1];
				
				if (x+din[i-1][j-k]>din[i][j]) 
				{
					din[i][j]=x+din[i-1][j-k];
					bA[i][j]=k;
				}
			}
	if (din[N][L]>=L) return 1;
	return 0;
}

int main()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	
	int i,j;
	int sol[NMAX][2];

	scanf("%d %d",&N,&L);

	for (i=1;i<=N;i++)
		scanf("%d %d",&v[i][0],&v[i][1]);

	int T,stp,st,dr,mid;

//	for (T=(1<<21)-1,stp=20;stp>=0;stp--)
//			if ( compute(T- (1 << stp) ) ) T-=(1<<stp);

	st=0;dr=1000;

	while (st<dr-1)
	{
		mid=(st+dr)/2;

		if ( compute(mid) ) dr=mid;
			else st=mid;
	}

	if ( compute(st) ) T=st;
		else T=dr;

	printf("%d\n",T);
	
	compute(T);
	
	for (i=N,j=L;i;i--)
	{
		sol[i][0]=bA[i][j];
		sol[i][1]=(T-bA[i][j]*v[i][0])/v[i][1];
		j-=bA[i][j];
	}
	
	for (i=1;i<=N;i++)
		printf("%d %d\n",sol[i][0],sol[i][1]);
	return 0;
}