Cod sursa(job #379576)

Utilizator otilia_sOtilia Stretcu otilia_s Data 2 ianuarie 2010 16:39:56
Problema Energii Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#include <cstring>
using namespace std;

int e[1003],c[1003], Smax,n,W;
int s[5000006],cs[5000006];

void citire()
{
	FILE *fin=fopen("energii.in","r");
	fscanf(fin,"%d %d",&n,&W);
	Smax=0;
	for (int i=1;i<=n;++i) 
	 {fscanf(fin,"%d %d", &e[i], &c[i]); Smax+=e[i];}
	fclose(fin);
}

int main()
{
	citire();
	FILE * fout=fopen("energii.out","w");
	if (Smax<W) { fprintf(fout,"-1"); fclose(fout);return 0;}
	memset(s,0,sizeof(s)); 
	int i,j;
	for (i=1;i<=n;++i) { s[e[i]]=i; cs[e[i]]=c[i];}
	for (i=1;i<W;++i)
		if (s[i])
		{
		 for (j=s[i]+1;j<=n;++j) 
		   { int val=i+e[j], cval=cs[i]+c[j];
			if (!s[val]){ s[val]=j; cs[val]=cval;}
			   else
				   if  (s[val]>0 && cs[val]>cval) cs[val]=cval; else
				   if (s[val]>0 && cs[val]==cval && s[val]>j) s[val]=j;			   
		   }
		}
	int cmin=6000000;
	for (i=W;i<=Smax;++i)
		if (s[i])
			if (cmin>cs[i]) cmin=cs[i];
	fprintf(fout,"%d\n",cmin);
	fclose(fout);
	return 0;
}