Cod sursa(job #222539)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 23 noiembrie 2008 12:48:37
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
using namespace std;
#include<stdio.h>
const int GMAX=1005, WMAX=10005;
int G,W,v[GMAX][3],rez[10005];

void citire()
{
	int i;
	freopen("energii.in","r",stdin);
	scanf("%d%d",&G,&W);
	for(i=1;i<=G;++i)
	{
		scanf("%d%d",v[i][1],v[i][2]);
	}
}

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;
					if(rez[j+v[i][1]] && 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];
		if(rez[v[i][1]] && rez[v[i][1]]>=v[i][2])//aceeasi comparatie pt a determina minimul pe acea portiune;
			rez[v[i][1]]=v[i][2];
	}
	for(i=W;i<WMAX;++i)
		if(rez[i] && rez[i]<=min)
			min=rez[i];
	if(min==WMAX)
		min=-1;
	return min;
}

int main()
{
	freopen("energii.out","w",stdout);
	citire();
	printf("%d",calcul());
	return 0;
}