Cod sursa(job #424211)

Utilizator NemultumituMatei Ionita Nemultumitu Data 24 martie 2010 18:04:49
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
int g,w,total,minim=1<<30;
int e[1010],c[1010],min[5010];

void citire()
{
	scanf("%d%d",&g,&w);
	for (int i=1;i<=g;++i)
	{
		scanf("%d%d",&e[i],&c[i]);
		total+=e[i];
	}
}

void knapsack()
{
	for (int i=1;i<=g;++i)
	{
		if (e[i]>=w)
		{
			if (c[i]<minim)
				minim=c[i];
			continue;
		}
		for (int j=w;j>e[i];--j)
		{
			if (j+e[i]>=w&&minim>min[j]+c[i])
				minim=min[j]+c[i];
			if (min[j-e[i]]&&min[j-e[i]]+c[i]<min[j])
				min[j]=min[j-e[i]]+c[i];
		}
		for (int j=e[i];j+e[i]>=w;--j)
			if (minim>min[j]+c[i])
				minim=min[j]+c[i];
		if (min[e[i]]>c[i])
			min[e[i]]=c[i];
	}
}

int main()
{
	freopen ("energii.in","r",stdin);
	freopen ("energii.out","w",stdout);
	citire();
	for (int i=1;i<=w;++i)
		min[i]=1<<30;
	if (total<w)
	{
		printf("%d\n",-1);
		return 0;
	}
	knapsack();
	printf("%d\n",minim);
	return 0;
}