Pagini recente » Cod sursa (job #2299958) | Cod sursa (job #2845790) | Cod sursa (job #2829986) | Cod sursa (job #1633062) | Cod sursa (job #44096)
Cod sursa(job #44096)
#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;
for ( j = 0 ; j < N ; ++j )
{
if (pow[j] >= i)
if(minn > c[j])
{
minn = c[j];
jmin = j;
//e[i] = 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];
jmin = j;
//e[i] = e[i-pow[j]] + pow[j];
}
}
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;
}