Cod sursa(job #204143)

Utilizator devilkindSavin Tiberiu devilkind Data 22 august 2008 11:25:27
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 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;

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

	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;
}