Cod sursa(job #492585)

Utilizator xtremespeedzeal xtreme Data 15 octombrie 2010 08:19:47
Problema Energii Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <assert.h>
#define Wmax 5000
#define INF 2000000000
#define Gmax 1000

int G, Gp, W, cost[2*Wmax+1], mark[2*Wmax+1], req[Gmax+1], gain[Gmax+1], min=INF;

void read()
      {
	   int i, a, b;		
	   
	   freopen("energii.in","r",stdin);
	   
	   scanf("%d%d",&G,&W);
	   //assert(W>1 && W<5001);
	   for(i=1;i<=G;i++)
			   {
		        scanf("%d %d",&a,&b);
				assert(a>1 && a<10001);// && b>1 && b<10001);
	            if(a>=W)
				    {
					 if(b<min)
				         min=b;
	                }
				else if(a!=0)
					   gain[++Gp]=a, req[Gp]=b;
				}
	   
	   fclose(stdin);
	   
	   for(i=1;i<=2*W;i++)
		      cost[i]=INF;
	   
	  }
void solve()
	{
	 int i, j;	 
		
	 for(i=1;i<=Gp;i++)
		 {
		  if(req[i] < cost[gain[i]])
			  cost[gain[i]]=req[i], mark[gain[i]]=1;
		  for(j=gain[i]+1;j<=2*W;j++)
			    if(cost[ j-gain[i] ]+req[i]<cost[j] && !mark[j-gain[i]])
					  cost[j]=cost[ j-gain[i] ]+req[i], mark[j]=1;
		  for(j=0;j<=2*W;j++)
			          mark[j]=0;
		 }
	}
void write()
	{
	 int i;
		
	 freopen("energii.out","w",stdout);
	 
	 for(i=W;i<=2*W;i++)
		    if(cost[i]<min)
				 min=cost[i];
	 if(min==INF) 
		     printf("-1\n");
	 else 
		     printf("%d\n",min);
	 
	 fclose(stdout);
	}
int main()
	{
	 read();
	 solve();
	 write();
	 return 0;
	}