Cod sursa(job #536771)

Utilizator skullLepadat Mihai-Alexandru skull Data 19 februarie 2011 12:16:46
Problema Energii Scor 55
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#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 <= 5001; ++i) sol[i] = -1;
    for (i = 1; i <= G; ++i) ind[i] = i;
    sort(ind+1, ind+G+1, cmp() );
    for (i = 1; i <= G; ++i)
        if ( !last[v[ind[i]]] ) { sol[v[ind[i]]] = c[ind[i]]; last[v[ind[i]]] = i; }
    for (i = 1; i <= 5005; ++i)
    {
        if ( last[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] != -1) 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;
}