Cod sursa(job #336998)

Utilizator drag0s93Mandu Dragos drag0s93 Data 2 august 2009 11:58:38
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<cstdio>
#include<vector>
using namespace std;

#define IN "energii.in","r",stdin
#define OUT "energii.out","w",stdout
#define PII pair<int,int>
#define w first 
#define c second
#define INF 999999999

int M[2][10010];
int g , w ;
PII V[1020];

int main()
{
	int crt = 1, prev = 0;
	
	freopen(IN);
	freopen(OUT);
	scanf("%d%d",&g,&w);
	for(int i = 1; i <= g ; ++i)	scanf("%d%d",&V[i].w,&V[i].c);
	
	//initializare:
	
	M[0][0] = 0;
	for(int i = 1 ; i <= 10000 ; ++i)
		M[0][i] = INF;
	//prog. dinamica:
	
	for(int i = 1 ; i <= g ; ++i)
	{
		for (int j = 0; j <= 10000; ++j)
			M[crt][j] = INF;
		
		M[crt][0] = 0;
		for(int j = 1 ; j <= 10000 ; ++j)
		{
			M[crt][j] = M[prev][j];
			if (j >= V[i].w && M[prev][j - V[i].w] + V[i].c < M[crt][j])
				M[crt][j] = M[prev][j - V[i].w] + V[i].c;
		}
		
		// trecere la pasul urmator
		if (crt == 0)
		{ 
			crt = 1;
			prev = 0;
		}
		else if (crt == 1)
		{
			crt = 0;
			prev = 1;
		}
	}
	int enmin = M[crt][w];
	for(int i = w + 1  ; i <= 10000 ; ++i)
		if(M[crt][i] < enmin)	enmin = M[crt][i];
	
	if(enmin == INF ) 
	{
		printf("-1\n");
		return 0;
	}
	printf("%d\n",enmin);
	return 0;
}