Cod sursa(job #2551145)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 19 februarie 2020 16:21:01
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define MAX 300000
#define MAX_GREUTATE 3000

using namespace std;

struct rucsac
{
    int w;
    int p;
}v[MAX + 1];

vector< rucsac >ales;
int dp[MAX_GREUTATE + 1];

bool cmp(rucsac a, rucsac b)
{
    if(a.w < b.w)return true;
    if(a.w == b.w && a.p > b.p)return true;

    return false;
}

int main()
{
    int n, g;

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

    fin >> n >> g;

    for(int i = 1; i <= n; i++)
        fin >> v[i].w >> v[i].p;

    sort(v + 1, v + n + 1, cmp);

    int cnt = 0, limita = 0;
    for(int i = 1; i <= n; i++)
    {
        if(v[i].w != v[i - 1].w)
        {
            cnt = 0;
            limita = g / v[i].w;
        }

        if(cnt < limita)
        {
            cnt++;
            ales.push_back(v[i]);
        }
    }

    int maxPret = -1;
    for(auto x : ales)
        for(int i = g - x.w; i >= 0; i--)
            if(dp[i + x.w] < dp[i] + x.p)
            {
                dp[i + x.w] = dp[i] + x.p;
                maxPret = max(maxPret, dp[i + x.w]);
            }

    fout << maxPret;

    fin.close();
    fout.close();

    return 0;
}