Cod sursa(job #3235708)

Utilizator popescu_georgePopescu George popescu_george Data 20 iunie 2024 17:21:37
Problema Problema rucsacului Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include<bits/stdc++.h>
using namespace std;
ifstream F("rucsac.in");
ofstream G("rucsac.out");
#define Z 2048
#define P pair<int,int>
int n,w,i,v,x,p=Z;
P a[5001];
char s[Z];
inline char A()
{
    if(p==Z)
        F.read(s,Z),p=0;
    return s[p++];
}
int B()
{
    char c;
    for(c=A();!isdigit(c);c=A());
    int n=0;
    for(;isdigit(c);n=10*n+c-48,c=A());
    return n;
}
int D(int i,int j)
{
    int r=0;
    for(;i<n&&a[i].first<j;r+=a[i].second,j-=a[i++].first);
    return i==n?r:r+a[i].second*j/a[i].first;
}
void E(int i,int z,int w)
{
    if(i==n)
        v=max(v,z);
    else {
        if(w>=a[i].first&&z+a[i].second+D(i+1,w-a[i].first)>v)
            E(i+1,z+a[i].second,w-a[i].first);
        if(z+D(i+1,w)>v)
            E(i+1,z,w);
    }
}
bool C(P a,P b)
{
    return a.second*b.first>=b.second*a.first;
}
int main()
{
    for(n=B(),w=B();i<n;a[i].first=B(),a[i++].second=B());
    for(sort(a,a+n,C),i=0;i<n&&x+a[i].first<=w;x+=a[i].first,v+=a[i++].second);
    return E(0,0,w),G<<v,0;
}