Cod sursa(job #2753194)

Utilizator mihai002016Zaharia Teodor Mihai mihai002016 Data 21 mai 2021 14:55:43
Problema Problema rucsacului Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.59 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("rucsac.in");
ofstream fout("rucsac.out");
struct stare
{
    int w;
    int p;
} X,Y;


void interclasare(vector <stare> a, vector <stare> b, vector <stare> &c,int M)
{
    vector<stare>::iterator it = a.begin();
    vector<stare>::iterator it1 = b.begin();
    while (it != a.end()&&it1 != b.end())
    {
        X=*it;
        Y=*it1;
        if(X.w<Y.w&&X.p>Y.p){
            it1++;
        }
        else
            if(X.w>Y.w&&X.p<Y.p){
            it++;
        }
        else
        if(X.w<Y.w)
        {
            if(X.w<=M)
            c.push_back(X);
            it++;
        }
        else
        {
            if(Y.w<=M)
            c.push_back(Y);
            it1++;
        }
    }
    while(it!=a.end())
    {
        X=*it;
        if(X.w>M)
            break;
        else
        {
            Y=c.back();
            if(X.p>Y.p)
                c.push_back(X);
        }
        it++;
    }
    while(it1!=b.end())
    {
        X=*it1;
        if(X.w>M)
            break;
        else
        {
            Y=c.back();
            if(X.p>Y.p)
                c.push_back(X);
        }
        it1++;
    }
}

bool apartine(vector <stare> a, stare b)
{
    for (vector<stare>::iterator it = a.begin() ; it != a.end(); ++it)
    {
        Y=*it;
        if(b.p==Y.p&&b.w==Y.w)
            return true;
    }
    return false;
}

void rucsac(int M,int n,int w[],int p[],int x[])
{
    vector <stare> S[n+2],T[n+2];
    X.p=0;
    X.w=0;
    S[0].push_back(X);
    X.p=p[1];
    X.w=w[1];
    T[0].push_back(X);
    for(int i=1; i<=n-1; i++)
    {
        interclasare(S[i-1],T[i-1],S[i],M);
        for (vector<stare>::iterator it = S[i].begin() ; it != S[i].end(); ++it)
        {
            X=*it;
            X.p=X.p+p[i+1];
            X.w=X.w+w[i+1];
            T[i].push_back(X);
        }
    }
    interclasare(S[n-1],T[n-1],S[n],M);
    X=S[n].back();
    //cout<<"Solutia este rucsacul de greutate "<<X.w<<" si valoare "<<X.p<<" format din obiectele ";
    fout<<X.p;
    /*for(int i=n-1;i>=0;i--)
    {
        if(apartine(S[i],X))
        {
            x[i+1]=0;
        }
        else
        {
            x[i+1]=1;
            X.w=X.w-w[i+1];
            X.p=X.p-p[i+1];
        }
    }
    for(int i=1;i<=n;i++)
        if(x[i]==1)
        cout<<i<<" ";*/
}
int main()
{
    int n,M;
    fin>>n>>M;
    int x[n+1],w[n+1],p[n+1];
    for(int i=1;i<=n;i++)
        fin>>w[i]>>p[i];
    rucsac(M,n,w,p,x);
    return 0;
}