Pagini recente » Cod sursa (job #2159566) | Cod sursa (job #1598698) | Cod sursa (job #2183823) | Cod sursa (job #2275837) | Cod sursa (job #3353421)
#include <bits/stdc++.h>
std::ifstream cin("rucsac.in");
std::ofstream cout("rucsac.out");
int n,max,sum[5010],ans;
struct fractii{int g,v;}a[5010];
void bkt(int poz,int sumg,int sumv)
{
ans=std::max(ans,sumv);
if(poz>n)
return;
if(sumg+a[poz].g<=max&&sumv+sum[poz]>ans)
bkt(poz+1,sumg+a[poz].g,sumv+a[poz].v);
if(sumv+sum[poz+1]>ans)
bkt(poz+1,sumg,sumv);
}
int main()
{
cin>>n>>max;
for(int i=1;i<=n;++i)
{
cin>>a[i].g>>a[i].v;
}
for(int i=1;i<=n;++i)
for(int j=1;j<n;++j)
if(a[j].v*a[j+1].g<a[j+1].v*a[j].g)
std::swap(a[j],a[j+1]);
for(int i=1;i<=n;++i)
{
int ga=0;
for(int j=i;j<=n;++j)
{
if(ga+a[j].g<max)
{
sum[i]+=a[j].v;
ga+=a[j].g;
if(i==1)
ans=sum[i];
}
else
{
sum[i]+=a[j].v*(max-ga)/a[j].g;
ga=max;
break;
}
}
}
/*std::cout<<ans<<'\n';
for(int i=1;i<=n;++i)
std::cout<<sum[i]<<' ';*/
bkt(1,0,0);
cout<<ans;
return 0;
}