Cod sursa(job #67941)

Utilizator nuexistnuexist nuexist Data 26 iunie 2007 00:18:52
Problema Energii Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<stdio.h>
#include<stdlib.h>
FILE *f=fopen("energii.in","r"), *g=fopen("energii.out","w");
struct nod {int cant,cost;} a[1024];
int n,w,i,j,ok;
long long s1[20005],s2[20005],min;
int comp(nod *a, nod *b)
{
	if(a->cant > b->cant) return 1;
	else if(a->cant == b->cant) if(a->cost > b->cost) return 1;
	return -1;
}
int main()
{
	fscanf(f,"%d %d",&n,&w);
	for(i=1;i<=n;i++) fscanf(f,"%d %d",&a[i].cant,&a[i].cost);
	fclose(f);

	qsort(a+1,n,sizeof(nod),(int (*)(const void *, const void *))comp);
	
	for(i=1;i<=n;i++)
	{
		s2[a[i].cant]=a[i].cost;
		for(j=1;j<=10500;j++)
			if(s1[j])
				{
					s2[j+a[i].cant]=s1[j]+a[i].cost;
					if(j+a[i].cant>=w) ok=1;
			}
		for(j=1;j<=10500;j++)
			if(s2[j]<s1[j]||!s1[j])
			s1[j]=s2[j];
	}

	if(!ok) fprintf(g,"-1\n");
	else {
		min=0x3f3f3f3f;
		for(i=w;i<=10500;i++)
			if(s1[i]!=0&&s1[i]<min) min=s1[i];
		fprintf(g,"%d\n",min);
	}
	fclose(g);
	return 0;
}