Cod sursa(job #2753197)

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

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


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)
        {
            if(X.w<=M){
                if(!c.empty()){
                Z=c.back();
            	if(X.p>Z.p)
                	c.push_back(X);
                }
                else
                 	c.push_back(X);
            }
            it++;
        }
        else
        {
            if(Y.w<=M){
                if(!c.empty()){
                Z=c.back();
            	if(Y.p>Z.p)
                	c.push_back(Y);
                }
                else
                    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+1],T[n+1];
    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;
}