Cod sursa(job #2417078)

Utilizator Carol_LucaCarol Luca Carol_Luca Data 28 aprilie 2019 20:46:05
Problema Problema rucsacului Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
/// 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;

}