Cod sursa(job #210878)

Utilizator DraStiKDragos Oprica DraStiK Data 29 septembrie 2008 19:59:48
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <stdio.h>
#define min(x,y) (x<y?x:y)
int g,w;
int eg[1005],cg[1005];
int c[1005][5005];
void read()
{
    int i;
    scanf ("%d%d",&g,&w);
    for (i=1; i<=g; ++i)
        scanf ("%d%d",&eg[i],&cg[i]);
}
void solve ()
{
    int i,j;
    for (i=1; i<=g; ++i)
        for (j=1; j<=w; ++j)
			c[i][j]=-1;
	for (i=1; i<=eg[1]; ++i)
		c[1][i]=cg[1];
	for (i=2; i<=g; ++i)
		c[i][1]=min(c[i-1][1],cg[i]);
	for (i=2; i<=g; ++i)
		for (j=2; j<=w; ++j)
			if (eg[i]<=j)
			{
				if (c[i-1][j]!=-1 && c[i-1][j-eg[i]]!=-1)
					c[i][j]=min(c[i-1][j],cg[i]+c[i-1][j-eg[i]]);
				else if (c[i-1][j-eg[i]]!=-1)
					c[i][j]=cg[i]+c[i-1][j-eg[i]];
			}
			else
			{
				if (c[i-1][j]!=-1)
					c[i][j]=min(c[i-1][j],cg[i]);
				else
					c[i][j]=cg[i];
			}
}
int main ()
{
	freopen ("energii.in","r",stdin);
	freopen ("energii.out","w",stdout);
	read ();
	solve ();
	printf ("%d",c[g][w]);
	return 0;
}