Cod sursa(job #2315650)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 10 ianuarie 2019 13:17:41
Problema Problema rucsacului Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#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;
}