Cod sursa(job #1680618)

Utilizator dorin31Geman Dorin Andrei dorin31 Data 8 aprilie 2016 21:57:29
Problema Problema rucsacului Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>

#define maxG 10010

using namespace std;

ifstream fin("rucsac.in");
ofstream fout("rucsac.out");

priority_queue <int, vector<int>, greater<int> > v[maxG];
int n,g,S,s,d[maxG];

void readData()
{
    int x,y;
    fin>>n>>g;
    for (int i=1; i<=n; ++i)
    {
        fin>>x>>y;
        v[x].push(y);
        if (!x) s+=y;
    }
}

void Knapsack()
{
    for (int i=1; i<=g; ++i)
    {
        int vSize=v[i].size(), nr=0;
        int limit=min(g/i,vSize);
        while (!v[i].empty()&&nr<limit)
        {
            int element=v[i].top();
            v[i].pop(); ++nr;
            for (int k=g; k>=i; --k)
                d[k]=max(d[k],d[k-i]+element);
        }
    }
    for (int i=1; i<=g; ++i)
        S=max(S,d[i]);
    fout<<S+s;
}

int main()
{
    readData();
    Knapsack();
    return 0;
}