Pagini recente » Cod sursa (job #1313100) | Cod sursa (job #1921200) | Cod sursa (job #877338) | Cod sursa (job #789202) | Cod sursa (job #3235708)
#include<bits/stdc++.h>
using namespace std;
ifstream F("rucsac.in");
ofstream G("rucsac.out");
#define Z 2048
#define P pair<int,int>
int n,w,i,v,x,p=Z;
P a[5001];
char s[Z];
inline char A()
{
if(p==Z)
F.read(s,Z),p=0;
return s[p++];
}
int B()
{
char c;
for(c=A();!isdigit(c);c=A());
int n=0;
for(;isdigit(c);n=10*n+c-48,c=A());
return n;
}
int D(int i,int j)
{
int r=0;
for(;i<n&&a[i].first<j;r+=a[i].second,j-=a[i++].first);
return i==n?r:r+a[i].second*j/a[i].first;
}
void E(int i,int z,int w)
{
if(i==n)
v=max(v,z);
else {
if(w>=a[i].first&&z+a[i].second+D(i+1,w-a[i].first)>v)
E(i+1,z+a[i].second,w-a[i].first);
if(z+D(i+1,w)>v)
E(i+1,z,w);
}
}
bool C(P a,P b)
{
return a.second*b.first>=b.second*a.first;
}
int main()
{
for(n=B(),w=B();i<n;a[i].first=B(),a[i++].second=B());
for(sort(a,a+n,C),i=0;i<n&&x+a[i].first<=w;x+=a[i].first,v+=a[i++].second);
return E(0,0,w),G<<v,0;
}