Cod sursa(job #475338)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 6 august 2010 17:57:48
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <iostream>
#include <string>

using namespace std;

#define GMAX 1005
#define WMAX 20005
#define inf 2000000000

int G, W, CMIN[WMAX][2], EC[GMAX], CC[GMAX], EMAX;

int main()
{
	freopen ("energii.in", "r", stdin);
	freopen ("energii.out", "w", stdout);
	
	scanf ("%d\n%d\n", &G, &W);
	
	for (int i = 1; i <= G; ++i)
		scanf ("%d %d\n", &EC[i], &CC[i]);
	
	//memset
	
	for (int i = 0; i < WMAX; ++i) 
	{
		CMIN[i][0] = inf;
		CMIN[i][1] = inf;
	}	
	
	CMIN[0][0] = 0;
	
	for (int i = 1; i <= G; ++i)
	{
		int cur = i % 2;
		int prev = !cur;
		
		EMAX += EC[i];
		
		EMAX = min(EMAX, 20000);
		
		//prima parte
		
		for (int j = 0; j < EC[i]; ++j)
			CMIN[j][cur] = CMIN[j][prev];
		
		//a doua parte
		
		for (int j = EC[i]; j <= EMAX; ++j)
		{
			int v1 = CMIN[j - EC[i]][prev] + CC[i];
			int v2 = CMIN[j][prev];
			
			CMIN[j][cur] = min(v1,v2);
		}	
		
		for (int j = EMAX - 1; j >= 0; --j) CMIN[j][cur] = min(CMIN[j][cur], CMIN[j+1][cur]);
	}
	
	if (CMIN[W][G%2] == 2000000000)  CMIN[W][G%2] = -1;
	
	printf ("%d", CMIN[W][G%2]);	
	
	return 0;
}