Cod sursa(job #461230)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 5 iunie 2010 22:42:32
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
int n, l, sol;
struct vect
{
	int a, b;
} v[102], rez[102];
int pred[102][102];

int exista (int timp)
{
	int d[102][102];
	for (int i = 0; i <= n; i ++)
		for (int j = 0; j <= l; j ++)
			d[i][j] = -1000000000;
	
	d[0][0] = 0;
	for (int i = 1; i <= n; i ++)
	{
		d[i][0] = 0;
		for (int j = 0; j <= l; j ++)
			for (int k = 0; k <= j && k <= timp / v[i].a; k ++)
			{
				if (d[i][j] < d[i - 1][j - k] + (timp - k * v[i].a) / v[i].b)
					d[i][j] = d[i - 1][j - k] + (timp - k * v[i].a) / v[i].b;
				pred[i][j] = k;
			}
	}
	return d[n][l] >= l;
}

int main ()
{
	freopen ("lapte.in", "r", stdin);
	freopen ("lapte.out", "w", stdout);
	scanf ("%d %d", &n, &l);
	
	for (int i = 1; i <= n; i ++)
		scanf ("%d %d", &v[i].a, &v[i].b);
	
	int st = 1, dr = 100, m;
	while (st <= dr)
	{
		m = (st + dr) >> 1;
		if (exista (m))
		{
			sol = m;
			dr = m - 1;
		}
		else 
			st = m + 1;
	}
	exista (sol);
	
	for (int i = n; i; i --)
	{
		rez[i].a = pred[i][l];
		l -= pred[i][l];
		rez[i].b = (sol - rez[i].a * v[i].a) / v[i].b;
	}
	
	printf ("%d\n", sol);
	for (int i = 1; i <= n; i ++)
		printf ("%d %d\n", rez[i].a, rez[i].b);
	return 0;
}