Pagini recente » Cod sursa (job #2277255) | Cod sursa (job #625928) | Monitorul de evaluare | Cod sursa (job #194645) | Cod sursa (job #3353428)
#include <bits/stdc++.h>
std::ifstream cin("rucsac.in");
std::ofstream cout("rucsac.out");
int n,max,sum[5010][510],ans,calc[10010];
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][(max-sumg)/20+1]>ans)
bkt(poz+1,sumg+a[poz].g,sumv+a[poz].v);
if(sumv+sum[poz+1][(max-sumg)/20+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,poz=i,gl=0;
for(int j=1;j<=max/20*20+20;++j)
{
if(poz>n)
break;
++gl;
calc[j]=calc[j-gl]+a[poz].v*gl/a[poz].g;
if(gl==a[poz].g)
{
gl=0;
++poz;
}
if(i==1&&j==n)
ans=calc[max-gl];
}
for(int j=1;j<=max/20+1;++j)
sum[i][j]=calc[j*20];
}
/*std::cout<<ans<<'\n';
for(int i=1;i<=n;++i)
std::cout<<sum[i]<<' ';*/
bkt(1,0,0);
cout<<ans;
return 0;
}