Pagini recente » Profil livadaru97 | Cod sursa (job #1372801) | Cod sursa (job #1478518) | Cod sursa (job #628341) | Cod sursa (job #2315650)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <climits>
#include <unordered_map>
#include <map>
#include <set>
#include <queue>
#define ll long long
using namespace std;
ifstream in("rucsac.in");
ofstream out("rucsac.out");
const int NMAX = 300005;
const int GMAX = 3005;
pair<int, int> v[NMAX];
priority_queue<int> q[GMAX];
int dp[GMAX];
int main() {
int n, g;
in >> n >> g;
int toadd = 0;
for(int i = 1; i <= n; i ++) {
in >> v[i].first >> v[i].second;
if(v[i].first == 0) {
toadd += v[i].second;
continue;
}
q[v[i].first].push(v[i].second);
if(q[v[i].first].size() * v[i].first > g)
q[v[i].first].pop();
}
for(int i = 1; i <= g; i ++)
dp[i] = INT_MIN;
dp[0] = 0;
for(int i = 1; i <= g; i ++) {
while(q[i].size()) {
int x = q[i].top();
q[i].pop();
for(int j = g; j >= i; j --)
if(dp[j - i] != INT_MIN)
dp[j] = max(dp[j], dp[j - i] + x);
}
}
int ans = 0;
for(int i = 1; i <= g; i ++)
ans = max(ans, dp[i]);
ans += toadd;
out << ans;
return 0;
}