Cod sursa(job #56394)

Utilizator randommanThe Randomizer randomman Data 29 aprilie 2007 15:20:07
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
/* Ivan Nicolae - Bucuresti */
/* Energii */

#include <stdio.h>

#define NMAX 1002
#define GMAX 10002
#define _fin "energii.in"
#define _fout "energii.out"

int i,j,n,m,E[NMAX],G[NMAX],cid1[GMAX],cid2[GMAX],w,s=0;

void mem_cpy(int [], int [], int);

void ReadData(void)
{
 int i;
 freopen(_fin,"r",stdin);
 scanf("%d%d",&n,&w);
 for (i=1;i<=n;i++)
    {
     scanf("%d%d",&E[i],&G[i]);
     s+=G[i];
    }
 fclose(stdin);
}

void SnackPack(void)
{
 int i,j;

 for (i=1;i<=n;i++)
    {
     mem_cpy(cid1,cid2,s);

     if (E[i] > cid2[G[i]])
       cid2[G[i]]=E[i];

     for (j=0;j<=s && cid2[j]<=w;j++)
	if (cid2[j] != 0 && cid2[j+G[i]] < cid2[j] + E[i])
	  cid2[j+G[i]]=cid2[j]+E[i];
    }
}

void PrintData(void)
{
 freopen(_fout,"w",stdout);
 int i,rez;
 for (i=1;i<=s;i++)
    if (cid2[i] >= w)
      { rez=cid2[i]; break; }
 printf("%d\n",rez);
 fclose(stdin);
}

int main(void)
{
 ReadData();
 SnackPack();
 PrintData();

 return 0;
}

void mem_cpy(int A[], int B[], int n)
{
 for (int i=0;i<=n;i++)
    A[i]=B[i];
}