Cod sursa(job #3353422)

Utilizator lucriLuchian Cristian lucri Data 7 mai 2026 11:04:14
Problema Problema rucsacului Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
std::ifstream cin("rucsac.in");
std::ofstream cout("rucsac.out");
int n,max,sum[5010][10010],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][max-sumg]>ans)
        bkt(poz+1,sumg+a[poz].g,sumv+a[poz].v);
    if(sumv+sum[poz+1][max-sumg]>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;++j)
        {
            if(poz>n)
                break;
            ++gl;
            sum[i][j]=sum[i][j-gl]+a[poz].v*gl/a[poz].g;
            if(gl==a[poz].g)
            {
                gl=0;
                ++poz;
            }
        }
        if(i==1)
            ans=sum[1][max-gl];
    }
    /*std::cout<<ans<<'\n';
    for(int i=1;i<=n;++i)
        std::cout<<sum[i]<<' ';*/
    bkt(1,0,0);
    cout<<ans;
    return 0;
}