Cod sursa(job #478357)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 18 august 2010 11:21:11
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#define Nmax 152

int A[Nmax],B[Nmax];
int din[Nmax][Nmax],lita[Nmax][Nmax];
int Caf[Nmax],Cbf[Nmax];
int n,L;

int merge(int T){
	int i,j,k,q;
	for(i=0;i<=n;++i) for(j=1;j<=L;++j) din[i][j]=-1;
	for(i=0;i<=n;++i) din[i][0]=0;
	
	for(i=1;i<=n;++i)
		for(j=0;j<=L;++j)
			for(k=0; k<= T/A[i] && k<=j; ++k)
			if( din[i-1][j-k] >= 0 ){
				q=(T-k*A[i])/B[i]; 
				
				if( din[i][j] < din[i-1][j-k] + q){
					din[i][j]=din[i-1][j-k] + q;
					lita[i][j]=k;
				}
			}
	if( din[n][L] >= L ){ din[n][L]=L; return 1; }
	return 0;
}

void afis(int T){
	int i,j=L;
	printf("%d\n",T);
	for(i=n; i>=1; --i){
		Caf[i]=lita[i][j];
		Cbf[i]=(T-Caf[i]*A[i])/B[i];
		j -= Caf[i];
	}
	for(i=1;i<=n;++i) printf("%d %d\n",Caf[i],Cbf[i]);
}

int main(){
	int i,l,r,mij,rez;
	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]);
	
	l=0,r=150;
	while( l<=r ){
		mij=l+(r-l)/2;
		if( merge(mij) ) rez=mij,r=mij-1;
		else l=mij+1;
	}
	
	merge(rez);
	afis(rez);
	fclose(stdin); fclose(stdout);
	return 0;
}