Cod sursa(job #557970)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 17 martie 2011 00:08:57
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <string>

using namespace std;

#define NM 105
#define inf 1000000

int N, A[NM], B[NM], L, DP[NM][NM], C[NM][NM], ANS[NM][2];

int posibil (int timp)
{
	for (int l = 1; l <= L; ++l) DP[0][l] = -inf;
	
	for (int i = 1; i <= N; ++i)
		for (int l = 0; l <= L; ++l)
		{
			DP[i][l] = -inf;
			C[i][l] = 0;
			
			for (int c = 0; c <= l; ++c)
			{
				if (c * A[i] > timp) break;
				
				if (DP[i][l] < DP[i-1][l-c] + (timp - c * A[i])/B[i])
				{
					DP[i][l] = DP[i-1][l-c] + (timp - c * A[i])/B[i];
					C[i][l] = c;
				}	
			}	
		}	
		
	if (DP[N][L] >= L) return 1;
	return 0;	
}

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", &A[i], &B[i]);
	
	int st = 1, dr = 20000;
	
	while (st < dr)
	{
		int mij = (st + dr)/2;
		
		if (posibil(mij)) dr = mij;
		else st = mij + 1;
		
		//printf ("%d %d\n", mij, posibil(mij));
	}	

	int timp = st;
	
	printf ("%d\n", timp);
	
	int LL = L;
		
	for (int i = N; i >= 1; --i)
	{
		ANS[i][0] = C[i][LL], ANS[i][1] = (timp - C[i][LL] * A[i])/B[i];
		LL -= C[i][LL];
	}		
	
	for (int i = 1; i <= N; ++i) printf ("%d %d\n", ANS[i][0], ANS[i][1]);
	
	return 0;
}