Cod sursa(job #58030)

Utilizator peanutzAndrei Homorodean peanutz Data 3 mai 2007 22:17:56
Problema Energii Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 20000//00

long a[NMAX], b[NMAX];
long n, w;
long long min = 2000000000;

int main()
{
	long k, i, j, c, e;
	//int c1[NMAX*100], c2[NMAX*100];

	freopen("energii.in", "r", stdin);
	freopen("energii.out", "w", stdout);

	min *= 2;

	scanf("%ld %ld\n", &n, &w);

	//a[0] = 1;
	//b[0] = 1;

	scanf("%ld %ld\n", &e, &c);

	a[e] = b[e] = c;

	//c1[0] = 0;
	//c1[++c1[0]] = e;

	for(k = 1; k < n; ++k)
	{
		scanf("%ld %ld\n", &e, &c);

		//c2[0] = 0;

		for(i = 1; i < NMAX; ++i)
		{
			if(a[i])
			{
				if(((i+e < NMAX) && (b[i + e] > a[i] + c)) || !b[i + e])
				{
					b[i + e] = a[i] + c;

					//c2[++c2[0]] = c1[i] + e;
				}
				//c2[++c2[0]] = c1[i];
			}
		}
		if((b[e] > c) || !b[e])
			a[e] = b[e] = c;

		//c2[ ++c2[0] ] = e;

		memcpy(a, b, sizeof(b));
		//memcpy(c1, c2, sizeof(c2));
	}

	for(i = w; i < NMAX; ++i)
	{
		if(a[i] && min > a[i])
		{
			min = a[i];
		}
	}

	if(min != NMAX)
		printf("%lld\n", min);
	else
		printf("-1\n");

	fclose(stdin);
	fclose(stdout);

	return 0;
}