Pagini recente » Cod sursa (job #31585) | Cod sursa (job #1054128) | Cod sursa (job #821020) | Cod sursa (job #2279013) | Cod sursa (job #2753197)
#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;
}