Cod sursa(job #2753187)

Utilizator mihai002016Zaharia Teodor Mihai mihai002016 Data 21 mai 2021 14:21:47
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.54 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)
{
    int L=1;
    vector<stare>::iterator it = a.begin();
    vector<stare>::iterator it1 = b.begin();
    while (it != a.end()&&it1 != b.end())
    {
        X=*it;
        Y=*it1;
        if(L==1)
        {
            if(X.w<Y.w)
            {
                if(X.w<=M)
                    c.push_back(X);
                it++;
            }
            else if (X.w==Y.w)
            {
                if(X.p>Y.p)
                {
                    if(X.w<=M)
                        c.push_back(X);
                    it++;
                    it1++;
                }
                else if(X.p<Y.p)
                {
                    if(Y.w<=M)
                        c.push_back(Y);
                    it++;
                    it1++;
                    L=2;
                }
                else
                {
                    if(X.w<=M)
                        c.push_back(X);
                    it++;
                    it1++;
                }
            }
            else
            {
                if(X.p<Y.p)
                {
                    if(Y.w<=M)
                        c.push_back(Y);
                    it++;
                    L=2;
                }
                else
                {
                    it1++;
                }
            }
        }
        else
        {
            if(X.w>Y.w)
            {
                if(Y.w<=M)
                    c.push_back(Y);
                it1++;
            }
            else if (X.w==Y.w)
            {
                if(X.p>Y.p)
                {
                    if(X.w<=M)
                        c.push_back(X);
                    it++;
                    it1++;
                    L=1;
                }
                else if(X.p<Y.p)
                {
                    if(Y.w<=M)
                        c.push_back(Y);
                    it++;
                    it1++;
                }
                else
                {
                    if(Y.w<=M)
                        c.push_back(Y);
                    it++;
                    it1++;
                }
            }
            else
            {
                if(X.p>Y.p)
                {
                    if(X.w<=M)
                        c.push_back(X);
                    it1++;
                    L=1;
                }
                else
                {
                    it++;
                }
            }
        }
    }
    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; 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],T[n],S[n+1],M);
    X=S[n+1].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;
}