Cod sursa(job #389644)

Utilizator avram_florinavram florin constantin avram_florin Data 1 februarie 2010 23:07:01
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<cstdio>
#include<cstdlib>
#define GMAX 1001
#define WMAX 5001
#define IN "energii.in"
#define OUT "energii.out"
#define min(a,b) (a)<(b)?(a):(b)

int G,W,best=99999999,w[WMAX];
typedef struct{
		int e,c;
		}generator; 
generator g[GMAX];
FILE *f;
FILE *out;

int main ()
{
	f=fopen(IN ,"r");
	fscanf(f, "%d" , &G);
	fscanf(f, "%d" , &W);
	int i,j,max1=0;
	for(i=1;i<=G;i++)
		fscanf(f, "%d%d" , &g[i].e , &g[i].c);
	w[0]=1;
	for(i=1;i<=G;i++)
		{
			for(j=min(max1,5000);j>=0;j--)
				if(j==0)
					{
						if(w[g[i].e]==0||w[g[i].e]>=g[i].c)
							{
								if(g[i].e<5001)
									w[g[i].e]=g[i].c;
								if(g[i].e>max1)
									max1=g[i].e;
								if(g[i].e>=W&&g[i].c<best)
								best=g[i].c;
							}
					}
					else
					if(w[j]!=0)
						{
							if(w[j+g[i].e]==0||w[j+g[i].e]>=w[j]+g[i].c)
								{
									if(j+g[i].e<5001)
										w[j+g[i].e]=w[j]+g[i].c;
									if(j+g[i].e>max1)
										max1=j+g[i].e;
									if(j+g[i].e>=W&&w[j]+g[i].c<best)
										best=w[j]+g[i].c;
								}
						}
		}
	out=fopen(OUT ,"w");
	if(best==99999999)
		fprintf(out , "-1\n");
		else
		fprintf(out , "%d\n" , best);
	return 0;
}