Cod sursa(job #222544)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 23 noiembrie 2008 13:11:30
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
using namespace std;
#include<fstream>
const int GMAX=2005, WMAX=20005;
int G,W,v[GMAX][3],rez[WMAX];

void citire()
{
	int i;
	ifstream in("energii.in");
	in>>G>>W;
	for(i=1;i<=G;++i)
	{
		in>>v[i][1]>>v[i][2];
	}
	in.close();
}

int calcul()
{
	int i,j, min=WMAX;
	for(i=1;i<=G;++i)
	{	
		if(v[i][1]<W)// nu mai are sens sa adaug daca energia unui singur generator e suficienta;
			for(j=1;j<W;++j)//daca energia <W, nu am nevoie sa caut decat generatoare cu energia in [1;W);
				if(rez[j])// daca se gaseste o suma de energii,
				{	
					if(!rez[j+v[i][1]])	
						rez[j+v[i][1]]=rez[j]+v[i][2];// se adauga costul pt suma la costul pt generatorul ales intai;
					else
						if(rez[j+v[i][1]]>rez[j]+v[i][2])
							rez[j+v[i][1]]=rez[j]+v[i][2];// OBS important!!! se compara valorile: ne intereseaza minimul!!!
				}
		if(!rez[v[i][1]])
			rez[v[i][1]]=v[i][2];
		else
			if(rez[v[i][1]]>v[i][2])//aceeasi comparatie pt a determina minimul pe acea portiune;
				rez[v[i][1]]=v[i][2];
	}
	j=0;
	for(i=W;i<WMAX;++i)
		if(rez[i]&& rez[i]<min)
		{	
			j=1;min=rez[i];
		}
	if(j==0)
		min=-1;	
			return min;
}

int main()
{
	ofstream out("energii.out");
	citire();
	out<<calcul();
	out.close();
	return 0;
}