Pagini recente » Cod sursa (job #2000591) | Cod sursa (job #1177667) | Cod sursa (job #2212357) | Cod sursa (job #1589058) | Cod sursa (job #2417078)
/// rucsac
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5, MAXG = 3000, INF = 1e9;
priority_queue <int> v[1 + MAXG];
int dp[1 + MAXG];
int main() {
int free_real_estate;
int n, g, i, w, p, j, sol;
freopen ("rucsac.in", "r", stdin);
freopen ("rucsac.out", "w", stdout);
scanf ("%d%d", &n, &g);
free_real_estate = 0;
for (i = 1; i <= n; i++) {
scanf ("%d%d", &w, &p);
if (w == 0)
free_real_estate += p;
else {
v[w].push (p);
while (v[w].size () * w > g)
v[w].pop ();
}
}
for (i = 1; i <= g; i++)
dp[i] = -INF;
dp[0] = 0;
for (i = 1; i <= g; i++) {
while (v[i].empty () == 0) {
p = v[i].top ();
v[i].pop ();
for (j = g; j >= i; j--)
if (dp[j - i] >= 0)
dp[j] = max (dp[j], dp[j - i] + p);
}
}
sol = 0;
for (i = 1; i <= g; i++)
sol = max (sol, dp[i]);
printf ("%d\n", sol + free_real_estate);
return 0;
}