Cod sursa(job #445280)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 23 aprilie 2010 13:18:24
Problema Energii Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <cstring>

#define file_in "energii.in"
#define file_out "energii.out"

#define Nmax 5000

int g,w;
int v[Nmax];
int eg[Nmax];
int cg[Nmax];

void citire()
{
	int i;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &g, &w);
	for (i=1;i<=g;++i)
		 scanf("%d %d", &eg[i],&cg[i]);
}

inline int min(int a, int b) { return a<b?a:b; }

void solve()
{
	int i,j,m=0x3f3f3f3f;
	
	memset(v,-1,sizeof(v));
	v[0]=0;
	for (i=1;i<=g;++i)
      	for (j=w;j>=0;--j)
			if (v[j]!=-1)
		 	{
				if (j+eg[i]<=w)
				{
					if (v[j+eg[i]]>v[j]+cg[i] || v[j+eg[i]]==-1)
			            v[j+eg[i]]=v[j]+cg[i];
				}
				if (j+eg[i]>w)
				{
					if (m>v[j]+cg[i])
						m=v[j]+cg[i];
				}				
			}
	if (m==0x3f3f3f3f || v[w]==-1)
	printf("-1\n");
    else
	{
		/*if (m!=0x3f3f3f3f && v[w]==-1)
			printf("%d\n", m);
		else
		if (m==0x3f3f3f3f && v[w]!=-1)
            printf("%d\n",v[w]);
		else
			printf("%d", min(m,v[w]));*/
		printf("%d\n", (m<v[w]?m:(v[w]==-1?m:v[w])));
	}
}


int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}