Cod sursa(job #44069)

Utilizator mika17Mihai Alex Ionescu mika17 Data 30 martie 2007 20:57:45
Problema Energii Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#define fin "energii.in"
#define fout "energii.out"
#define NMAX 1000
#define WMAX 5001
#define INF NMAX*10000+1

int uz[WMAX][NMAX],N,G,pow[NMAX],c[NMAX],min[WMAX];

void readData()
{
 freopen(fin,"r",stdin);
 scanf("%d %d",&N,&G);
 for( int i = 0 ; i < N ; ++i )
   scanf("%d %d",&pow[i],&c[i]);
 fclose(stdin);
}

void writeData()
{
 freopen(fout,"w",stdout);
 if(min[G]==INF) printf("-1");
  else printf("%d",min[G]);
 fclose(stdout);
}

void calc()
{
 int i,j,e[WMAX];
 e[0] = -1;
 for ( i = 1 ; i <= G ; ++i )
 {
  min[i] = INF;
  if( i <= e[i-1] )
   {
    min[i] = min[i-1];
    for ( int k = 0 ; k < N ; ++k)
      uz[i][k] = uz[i-1][k];
    e[i] = e[i-1];
    continue;
   }
  int minn=INF,jmin=-1,gmax=-1;
  for ( j = 0 ; j < N ; ++j )
  {
    if (pow[j] >= i)
      if(minn > c[j] | minn==c[j] & pow[j]>gmax)
       {
	minn = c[j];
	jmin = j;
	gmax = pow[j];
       }
    if (pow[j] < i)
      if(!uz[i-pow[j]][j] &
	(minn > min[i-pow[j]] + c[j] | minn == min[i-pow[j]] + c[j] & e[i-pow[j]]+pow[j]>gmax ) )
       {
	minn = min[i-pow[j]] + c[j];
	jmin = j;
	gmax = e[i-pow[j]] + pow[j];
       }
  }
  e[i] = gmax;
  min[i] = minn;
  if(pow[jmin]<i)
    for ( int k = 0 ; k < N ; ++k )
      uz[i][k] = uz[i-pow[jmin]][k];
  uz[i][jmin] = 1;
 }
}

int main()
{
 readData();
 calc();
 writeData();
 return 0;
}