Cod sursa(job #699059)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 29 februarie 2012 17:19:47
Problema Energii Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<cstdio>
using namespace std;
short eprod[1001];
short cost[1001];
long costptprod[5001]; //acest sir retine pe pozitia i, costul pentru a obtine aceasta energie
int main()
{
	long n,i,w,j;
	long minim=999999999;
	FILE* f;
	f=fopen("energii.in","r");
	fscanf(f,"%ld\n%ld",&n,&w);
	for(i=1;i<=n;++i)
		fscanf(f,"%hd %hd\n",&eprod[i],&cost[i]);
	fclose(f);
	for(i=1;i<=w;++i)
		costptprod[i]=-1;
	costptprod[0]=0; //nu costa nimic pentru a produce 0 energie
	for(i=1;i<=n;++i)
	{
		for(j=w;j>=0;--j)
			if(costptprod[j]!=-1)  //daca costptprod[j]==-1, atunci inseamna ca nu exista nicio cale de a obtine aceasta cantitate de energie
			{                      //folosind primele (i-1) generatoare
				if(j+eprod[i]>w)
				{
					if(minim>(costptprod[j]+cost[i]))
						minim=costptprod[j]+cost[i];
				}
				if(j+eprod[i]<=w)
					if((costptprod[j+eprod[i]]>costptprod[j]+cost[i])||(costptprod[i]==-1))
						costptprod[j+eprod[i]]=costptprod[j]+cost[i];
			}
	}
	FILE* g;
	g=fopen("energii.out","w");
	if((costptprod[w]==-1)&&(minim==999999999))
		fprintf(g,"%ld",costptprod[w]);
	else
	{
		if(minim<costptprod[w])
			fprintf(g,"%ld",minim);
		else
		{
			if(costptprod[w]!=-1)
				fprintf(g,"%ld",costptprod[w]);
			else
				fprintf(g,"%ld",minim);
		}
	}
	fclose(g);
	return 0;
}