Pagini recente » Cod sursa (job #2855263) | Cod sursa (job #893047) | Cod sursa (job #1470409) | Cod sursa (job #687360) | Cod sursa (job #536757)
Cod sursa(job #536757)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define nmax 1005
#define mx 10005
#define INF 2000000000
int v[nmax], c[nmax], ind[nmax], sol[mx], last[mx];
int G, W;
struct cmp
{
bool operator () (const int &a, const int &b ) const
{
return double(v[a])/double(c[a]) > double(v[b])/double(c[b]);
}
};
void citire ()
{
int i;
freopen("energii.in","r",stdin);
scanf("%d%d", &G, &W);
for (i = 1; i <= G; ++i) scanf("%d%d", &v[i], &c[i]);
}
void solve ()
{
int i, j;
for (i = 1; i <= G; ++i) ind[i] = i;
sort(ind+1, ind+G+1, cmp() );
for (i = 1; i <= G; ++i)
if ( !sol[v[ind[i]]]) { sol[v[ind[i]]] = c[ind[i]]; last[v[ind[i]]] = i; }
for (i = 1; i <= 5005; ++i)
{
if ( sol[i] )
for (j = last[i]+1; j <= G; ++j)
if ( (!last[i+v[ind[j]]] || j < last[i+v[ind[j]]]) && i+v[ind[j]]<mx )
{ sol[i+v[ind[j]]] = sol[i] + c[ind[j]]; last[i+v[ind[j]]] = j; }
}
}
void afisare ()
{
int i, minim = INF;
for (i = W; i <= 5001; ++i) if (sol[i]) minim = min(minim, sol[i]);
freopen("energii.out","w",stdout);
if (minim != INF) printf("%d\n", minim);
else printf("-1");
}
int main ()
{
citire ();
solve ();
afisare ();
return 0;
}