Cod sursa(job #1855330)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 23 ianuarie 2017 16:25:51
Problema Problema rucsacului Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define NMAX 3001

int D[ NMAX ];
vector < int > v[ NMAX ];

bool cmp ( int x, int y ) { return x > y; }

int main () {

    freopen( "ruksak.in", "r", stdin );
    freopen( "ruksak.out", "w", stdout );

    int n, m, i, j, x, y, k, s, G;

    scanf( "%d%d",&n,&G );
    for ( i = 1; i <= n; ++i ) {
        scanf( "%d%d",&x,&y );
        v[ x ].push_back( y );
    }

    for ( i = 0; i <= G; ++i ) {
        sort( v[ i ].begin(), v[ i ].end(), cmp );
        D[ i ] = -1;
    }

    D[ 0 ] = y = 0;
    for ( k = 0; k <= G; ++k ) {
        m = v[ k ].size();
        s = k;
        for ( i = 0; i < m && s <= G; ++i ) {
            x = v[ k ][ i ];
            s += k;
            for ( j = G - k; j >= 0; --j ) {
                if ( D[ j ] != -1 && D[ j + k ] < D[ j ] + x ) {
                    D[ j + k ] = D[ j ] + x;
                    if ( D[ j + k ] > y ) y = D[ j + k ];
                }
            }
        }
    }

    printf( "%d",y );

    return 0;

}