Cod sursa(job #3353421)

Utilizator lucriLuchian Cristian lucri Data 7 mai 2026 10:57:19
Problema Problema rucsacului Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#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;
}