Cod sursa(job #2397605)

Utilizator DovlecelBostan Andrei Dovlecel Data 4 aprilie 2019 16:51:30
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>

using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int N=102;
pair<int,int>v[N],obiect[N*N];
int n,cnt,L,profit[2][N*N],index[N*N];
bool a[N*N][N];
void citire();
void reset(int l);
void create(int time);

bool rucsac(int time)
{
    create(time);
    reset(cnt);
    for(int i=1;i<=cnt;i++)
    {
        for(int j=L-obiect[i].first, k=L-obiect[i].second;max(k,j)>0;)
        {
            if(j>k)
            {
                if(profit[1][j]!=-1 && profit[1][j]+v[index[i]].first>profit[1][j+obiect[i].first])
                {
                    profit[1][j+obiect[i].first]=profit[1][j]+v[index[i]].first;
                }
                j--;
            }
            else
            {
                if(profit[2][j]!=-1 && profit[2][j]+v[index[i]].second>profit[2][j+obiect[i].second])
                {
                    profit[2][j+obiect[i].second]=profit[2][j]+v[index[i]].second;
                }
                k--;
            }

        }
    }
    return (profit[2][cnt]>=L);
}

int main()
{
    citire();
    int p=0;
    for(int bit=14;bit>=0;bit--)
        if(!rucsac(p+(1<<bit)))
            p=p+(1<<bit);
    out<<p+1;
    return 0;
}

void citire()
{
    in>>n>>L;
    for(int i=1;i<=n;i++)
        in>>v[i].first>>v[i].second;
}
void reset(int l)
{
    for(int i=1;i<=l;i++)
    {
        profit[1][i]=-1;
        profit[2][i]=-1;
    }
    for(int i=1;i<=l;i++)
        for(int j=1;j<=n;j++)
            a[i][j]=false;
}
void create(int time)
{
    cnt=0;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=time;j++)
        {
            obiect[++cnt].first=v[i].first*j;
            obiect[cnt].second=v[i].second*(time-j);
            index[cnt]=i;
        }
}