Cod sursa(job #52605)

Utilizator peanutzAndrei Homorodean peanutz Data 19 aprilie 2007 13:45:53
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 110

int n, l;
int a[NMAX], b[NMAX];
int t;
int v[NMAX];//v[i] = cant maxima de lapte b bauta, pt i de a
int vaux[NMAX];
int last[NMAX];//last[i] = ultimul care a baut o cant x din a(si x-a de b), pentru a obtine v[i]

void read()
{
	int i;

	scanf("%d %d\n", &n, &l);
	for(i = 0; i < n; ++i)
	{
		scanf("%d %d\n", &a[i], &b[i]);
	}
}

void afisare(int i, int t, int nr)
{
	if(nr == -1)
		return ;

	afisare(i - last[i], t, nr-1);

	printf("%d %d\n", last[i], (t - last[i]*a[nr])/b[nr]);
}

int dinamic(int t)
{
	int i, j, k;

	memset(v, 0, sizeof(v));
	memset(vaux, 0, sizeof(vaux));
        memset(last, 0, sizeof(last));

	for(i = 0; i <= t/a[0]; ++i)
	{
		v[i] = (t - i*a[0])/b[0];
		last[i] = i;
	}

	for(i = 1; i < n; ++i)
	{
		memcpy(vaux, v, sizeof(v));

		for(j = 0; j < NMAX; ++j)
		{
			if(v[j])
			{
				for(k = 0; k <= t / a[i]; ++k)//ramane (t - k*a[i]) / b[i] de lapte b pe care-l poti bea ..
					if(v[j] + ((t - k*a[i])/b[i]) > vaux[j + k])
					{
						vaux[j + k] = v[j] + ((t - k*a[i])/b[i]);
						last[j + k] = k;
					}
			}
		}
		memcpy(v, vaux, sizeof(vaux));
	}
	for(i = l; i < NMAX; ++i)
	{
		if(v[i] >= l)
			{
				printf("%d\n", t);

				afisare(i, t, n-1);

				//for(j = 0; j <= i; ++j)
                                  //	printf("%d %d %d\n", j, v[j], last[j]);

				return 1;
			}
	}
	return 0;
}

int main()
{
	int i;
	freopen("lapte.in", "r", stdin);
	freopen("lapte.out", "w", stdout);

	read();

	for(i = 1; i < NMAX; ++i)
	{
		if(dinamic(i))
			return 0;
	}

	fclose(stdin);
	fclose(stdout);

	return 0;
}