Pagini recente » Cod sursa (job #2619412) | Cod sursa (job #376261) | Cod sursa (job #2295583) | Cod sursa (job #346936) | Cod sursa (job #2901219)
# 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;
}