Cod sursa(job #418243)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 15 martie 2010 18:15:01
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <string.h>
#define MAXN 120
#define INF 200000000

int a[MAXN], b[MAXN];
int d[MAXN][MAXN];
int ant[MAXN][MAXN];
int i,n,st,dr,mij,sol,l;
int reza[MAXN], rezb[MAXN];

bool ok(int x)
{
	int i,j,k;
	memset(d,0,sizeof(d));
	memset(ant,0,sizeof(ant));
	for (i=0; i<=n; i++){
		for (j=1; j<=l; j++)
			d[i][j] = -INF;
		d[i][0] = 0;
	}
	for (i=1; i<=n; i++){
		for (j=1; j<=l; j++){
			for (k=0; k<=x/a[i] && k<=j; k++)
				if (d[i][j] < d[i-1][j-k]+(x-k*a[i])/b[i]){
					d[i][j] = d[i-1][j-k]+(x-k*a[i])/b[i];
					ant[i][j] = k;
				}
		}
	}
	if (d[n][l] >= l)
		return true;
	else 
		return false;
}

int main()
{
	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]);
	st = 0; dr = (a[1]+b[1])*l;
	while (st<=dr) {
		mij = (st+dr)/2;
		if (ok(mij)){
			sol = mij;
			dr = mij-1;
		}
		else
			st=mij+1;
	}
	ok(sol);
	for (i=n; i>=1; i--){
		reza[i] = ant[i][l];
		l -= reza[i];
		rezb[i] = (sol-reza[i]*a[i])/b[i];
	}
	printf("%d\n", sol);
	for (i=1; i<=n; i++)
		printf("%d %d\n",reza[i], rezb[i]);
	return 0;
}