Cod sursa(job #1680580)

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

#define maxG 10010

using namespace std;

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

vector <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_back(y);
        if (!x) s+=y;
    }
}

bool cmp(int a, int b)
{
    return a>b;
}

void Knapsack()
{
    for (int i=1; i<=g; ++i)
    {
        sort(v[i].begin(), v[i].end(), cmp);
        int vSize=v[i].size();
        int limit=min(g/i,vSize);
        for (int j=0; j<limit; ++j)
            for (int k=g; k>=i; --k)
                d[k]=max(d[k],d[k-i]+v[i][j]);
    }
    for (int i=1; i<=g; ++i)
        S=max(S,d[i]);
    fout<<S+s;
}

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