Cod sursa(job #1664305)

Utilizator papinubPapa Victor papinub Data 26 martie 2016 12:39:41
Problema Problema rucsacului Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
# include <cstdio>
# include <algorithm>
using namespace std;

FILE *f = freopen("rucsac.in", "r", stdin);
FILE *g = freopen("rucsac.out", "w", stdout);

const int N_MAX = 30001;
const int G_MAX = 10001;
const int bufferDIM = 10001;

int cnt[G_MAX];

struct obiect{
    int w;
    int p;

    bool operator < (const obiect &other) const
    {
        return (this -> p > other.p);
    }
}v[N_MAX];

/*class inputReader{
    int pos;
    char buffer[bufferDIM];

public :

    bool digit(char c)
    {
        return ('0' <= c && c <= '9');
    }

    void get_buffer()
    {
        fread(buffer, 1, bufferDIM, stdin);
        pos = 0;
    }

    void getINT(int &nr)
    {
        while (!digit(buffer[pos]))
            if (++pos == bufferDIM)
                get_buffer();

        nr = 0;

        while (digit(buffer[pos]))
        {
            nr = nr * 10 + buffer[pos] - '0';

            if (++pos == bufferDIM)
                get_buffer();
        }
    }
}cin;*/

int dp[2][G_MAX];

int n, G;

void read()
{
    scanf("%d %d", &n, &G);

    for (int i=1; i<=n; i++)
    {
        scanf("%d %d", &v[i].w, &v[i].p);
    }
}

void solve()
{
    int l = 1;

    for (int i=1; i<=n; i++)
    {
        l = 1 - l;
        cnt[v[i].w] ++;

        //if (cnt[v[i].w] * v[i].w <= G)
        {
            for (int greutate=0; greutate<=G; greutate++)
            {
                dp[1-l][greutate] = dp[l][greutate];

                if (greutate >= v[i].w)
                    if (dp[l][greutate - v[i].w] + v[i].p> dp[1-l][greutate])
                        dp[1-l][greutate] = dp[l][greutate - v[i].w] + v[i].p;
            }
        }
    }

    printf("%d\n", dp[1-l][G]);
}

int main()
{
    read();
    sort(v+1, v+n+1);
    solve();
    return 0;
}