Pagini recente » Cod sursa (job #312246) | Cod sursa (job #2886070) | Cod sursa (job #2211436) | Monitorul de evaluare | Cod sursa (job #1855334)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define NMAX 10001
int D[ NMAX ];
vector < int > v[ NMAX ];
bool cmp ( int x, int y ) { return x > y; }
int main () {
freopen( "rucsac.in", "r", stdin );
freopen( "rucsac.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;
}