Cod sursa(job #2093102)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 22 decembrie 2017 22:37:50
Problema Problema rucsacului Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#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;
}