Pagini recente » Cod sursa (job #292567) | Cod sursa (job #888446) | Cod sursa (job #2398258) | Cod sursa (job #1228284) | Cod sursa (job #2093102)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f ("rucsac.in");
ofstream g ("rucsac.out");
const int nmax=3*1e5;
int n,usu,a,b,sol,p,d[5003],k;
vector <int> v[nmax];
int main()
{
f>>n>>usu;
for(int i=1;i<=n;++i)
{
f>>a>>b;
if(!a) sol+=b;
else v[a].push_back(b);
}
for(int i=1;i<=usu;++i)
{
sort(v[i].begin(),v[i].end());
p=v[i].size();
if(p>usu/i) p=usu/i;
for(int j=0;j<p;++j)
{
for(k=usu;k>=i;--k) d[k]=max(d[k],d[k-i]+v[i][j]);
}
}
while(true)
{
if(usu==0)
{
g<<sol;
return 0;
}
if(d[usu])
{
g<<d[usu]+sol;
return 0;
}
--usu;
}
return 0;
}