Cod sursa(job #3001141)

Utilizator velciu_ilincavelciu ilinca velciu_ilinca Data 13 martie 2023 11:43:42
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;
ifstream in("ruksak.in");
ofstream out("ruksak.out");

const int nmax = 300000;
int dp[nmax + 1];
struct elem
{
    int gr,pr;
};
elem v[nmax + 1];
vector<elem>optim;
int N,G;
bool cmp(elem a, elem b)
{
    if(a.gr > b.gr)
        return true;
    if(a.gr == b.gr)
        if(a.pr > b.pr)
            return true;
    return false;
}
int main()
{
    in>>N>>G;
    int pr0 = 0;
    for(int i = 1; i <= N; i++)
        in>>v[i].gr>>v[i].pr;

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

    int j = 1;
    for(int i = 1; i <= N; i++)//scapam de elem inutile
    {
        if(v[i].gr == 0)
            pr0 += v[i].gr;
        else if(v[i].gr == v[j].gr && G/v[i].gr >= (i - j + 1))//cate elem cu aceasta greutate incap
            optim.push_back(v[i]);//incap mai multe decat am pus deja
        else if(v[i].gr != v[j].gr && G/v[i].gr >= (i - j + 1))
        {
            j = i;
            optim.push_back(v[i]);
        }
    }

    int k = optim.size();
    for(int i = 0; i < k; i++)
        for(int j = G; j >= 0; j--)
            if(dp[j + optim[i].gr] < dp[j] + optim[i].pr)
                dp[j + optim[i].gr] = dp[j] + optim[i].pr;
    out<<dp[G] + pr0;
    return 0;
}