Pagini recente » Cod sursa (job #3212972) | Cod sursa (job #2012813) | Cod sursa (job #3157448) | Cod sursa (job #1083154) | Cod sursa (job #44069)
Cod sursa(job #44069)
#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;
}