Cod sursa(job #44107)

Utilizator mika17Mihai Alex Ionescu mika17 Data 30 martie 2007 21:16:30
Problema Energii Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <string.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];
 memset(e,0,sizeof e);
 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])
        if(minn > min[i-pow[j]] + c[j] |
           minn == min[i-pow[j]] + c[j] & gmax < e[i-pow[j]] + pow[j])
        {
         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;
}