Cod sursa(job #3254937)

Utilizator Deleanu_LucaDeleanu Luca Deleanu_Luca Data 9 noiembrie 2024 10:32:36
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
#define NMAX 5005

using namespace std;

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

int N,G;
int v[NMAX],Pmax,Sp[NMAX],minw[NMAX];

struct obiect
{
    int w,p;
}obj[NMAX];

bool valid(int pos, int gr, int pr)
{
    return (gr<=G) && (pr+Sp[pos]>Pmax) && (minw[pos]<=G-gr);
}

void bkt(int pos, int gr, int pr)
{
    if(!valid(pos,gr,pr)) return;

    if(pos==N+1)
    {
        if(pr>Pmax)
            Pmax=pr;
        return;
    }

    v[pos]=0;
    bkt(pos+1,gr,pr);
    v[pos]=1;
    bkt(pos+1,gr+obj[pos].w,pr+obj[pos].p);
}

bool cmp(obiect a, obiect b)
{
    return (a.p*b.w > b.p*a.w);
}

int main()
{
    int i;

    fin>>N>>G;

    for(i=1; i<=N; i++)
    {
        fin>>obj[i].w>>obj[i].p;

    }

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

    for(i=1; i<=N; i++)
        Sp[i]=Sp[i-1]+obj[i].p;

    minw[N]=obj[N].w;
    for(i=N-1; i>1; i--)
        minw[i]=min(minw[i+1],obj[i+1].w);

    bkt(1,0,0);

    fout<<Pmax;

    return 0;
}