Cod sursa(job #2901219)

Utilizator papinubPapa Victor papinub Data 13 mai 2022 12:39:51
Problema Problema rucsacului Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 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];
{1}
public :
{1}
    bool digit(char c)
    {
        return ('0' <= c && c <= '9');
    }
{1}
    void get_buffer()
    {
        fread(buffer, 1, bufferDIM, stdin);
        pos = 0;
    }
{1}
    void getINT(int &nr)
    {
        while (!digit(buffer[pos]))
            if (++pos == bufferDIM)
                get_buffer();
{1}
        nr = 0;
{1}
        while (digit(buffer[pos]))
        {
            nr = nr * 10 + buffer[pos] - '0';
{1}
            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++)
    {
        cnt[v[i].w] ++;
 
        if (cnt[v[i].w] * v[i].w <= G)
        {
            l = 1 - l;
 
            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;
}