Cod sursa(job #215946)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 21 octombrie 2008 20:17:30
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int n, l, b[101], a[101], c[101][101];
typedef struct
{
	int y, a, b;
} Laptar;
Laptar r[101][101];

int min(int x, int y) { return x < y ? x : y;}
int max(int x, int y) { return x > y ? x : y;}

void citire()
{
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
	scanf("%d %d", &n, &l);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d %d",&a[i], &b[i]);		
}

int verif(int T)
{
	int i, j, k;
	
	j = 0;
	while (j * a[1] <= T)
	{
		c[1][j] = (T - (j * a[1])) / b[1];
		r[1][j].y = 0;
		r[1][j].a = j;
		r[1][j].b = (T - (j * a[1])) / b[1];
		j++;
	}

	for (i = 2; i <= n; i++)
		for (j = 0; j <= l; j++)
		{
			int maxim = 0;
			for (k = 0; k * a[i] <= T; k++)
				if (maxim < c[i - 1][j - k] + (T - a[i] * k) / b[i])
				{
					maxim = c[i - 1][j - k] + (T - a[i] * k) / b[i];
					r[i][j].y = j - k;
					r[i][j].a = k;
					r[i][j].b = (T - a[i] * k) / b[i];
				}
					
			c[i][j] = maxim;
			if (j >= l && maxim >= l) return 1;
			
		}
	return 0;
}

int search()
{
	int p, u, m;
	p = 1; u =130;
	while (p <= u)
	{
		m = (p + u) / 2;
		if (verif(m) && !verif(m - 1)) return m;
		else if (verif(m - 1)) u = m - 1;
		else if (!verif(m)) p = m + 1;
	}
	return 0;
}

void reconst(int x, int y)
{
	if (x > 0)
	{
		reconst(x - 1, r[x][y].y);
		printf("%d %d\n",r[x][y].a,r[x][y].b);
	}
}

int main()
{
	citire();

	int rez = search();
	verif(rez);
	printf("%d\n",rez);

	reconst(n,l);
	return 0;
}