Cod sursa(job #640983)

Utilizator sebii_cSebastian Claici sebii_c Data 26 noiembrie 2011 22:11:05
Problema Lapte Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <string.h>
#define NMAX 100

int A[NMAX], B[NMAX], dp[NMAX][NMAX], sav[NMAX][NMAX];
int drankA[NMAX], drankB[NMAX];
int n, l;

int solve(int time)
{
	int i, j, k;
	memset(dp, 0xab, sizeof(dp));
	memset(sav, 0, sizeof(sav));	
	
	dp[0][0] = 0;
	for (i = 0; i < n; ++i)
		for (j = 0; j <= l; ++j)
			for (k = 0; A[i + 1] * k <= time; ++k) {
				if (dp[i + 1][j + k] < dp[i][j] + (time - A[i + 1] * k) / B[i + 1]) {
					dp[i + 1][j + k] = dp[i][j] + (time - A[i + 1] * k) / B[i + 1];
					sav[i + 1][j + k] = k;
				}
			}
	if (dp[n][l] >= l)
		return 1;
	return 0;
}

void rec(int time)
{
	int i, pos = l;
	for (i = n; i; --i) {
		drankA[i] = sav[i][pos];
		drankB[i] = (time - A[i] * drankA[i]) / B[i];
		pos -= sav[i][pos];
	}
}

int main()
{
	freopen("lapte.in", "r", stdin);
	freopen("lapte.out", "w", stdout);
	int i;
	scanf("%d %d", &n, &l);
	for (i = 1; i <= n; ++i)
		scanf("%d %d", &A[i], &B[i]);

	int pos = 0;
	int mid, lo = 1, hi = 100;
	while (lo <= hi) {
		mid = (lo + hi) / 2;
		if (solve(mid)) {
			pos = mid;
			hi = mid - 1;
			rec(mid);
		}
		else
			lo = mid + 1;
	}
	printf("%d\n", pos);	
	for (i = 1; i <= n; ++i)
		printf("%d %d\n", drankA[i], drankB[i]);
	return 0;
}