Cod sursa(job #516062)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 23 decembrie 2010 01:07:54
Problema Energii Scor 5
Compilator cpp Status done
Runda 14pb_simple Marime 0.95 kb
#include <iostream>
#include <string>

using namespace std;

#define NM 1005
#define EM 10005
#define inf 0x3f3f3f3f

int W, G, EG[NM], CG[NM], tot, EMAX, CMIN[EM][2];

int main()
{
	freopen ("energii.in", "r", stdin);
	freopen ("energii.out", "w", stdout);
	
	scanf ("%d %d", &G, &W);
	
	for (int i = 1; i <= G; ++i) 
	{	
		scanf ("%d %d", &EG[i], &CG[i]);
		tot += EG[i];
	}	
	
	if (tot < W)
	{
		printf ("-1");
		return 0;
	}	
	
	memset (CMIN, inf, sizeof(CMIN));
	
	CMIN[0][0] = 0;
	
	for (int i = 1; i <= G; ++i)
	{
		int cur = i % 2;
		int prev = !cur;
		
		EMAX += EG[i];
		EMAX = min(EMAX, 20000);
		
		for (int j = 0; j < EG[i]; ++j) CMIN[j][cur] = CMIN[j][prev];
		for (int j = EG[i]; j <= max(EMAX, W); ++j) CMIN[j][cur] = min (CMIN[j-EG[i]][prev] + CG[i], CMIN[j][prev]);
	}
	
	int best = inf;
	
	for (int j = W; j <= max(EMAX, W); ++j) best = min(best, CMIN[j][G%2]);
	
	printf ("%d\n", best);
	
	return 0;
}