Cod sursa(job #1847349)

Utilizator ArambasaVlad Arambasa Arambasa Data 14 ianuarie 2017 15:58:34
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
using namespace std;
ifstream in ("lapte.in");
ofstream out ("lapte.out");
int DP[150][255],pos[105][255];
int n,l,ans;
pair <int,int> v[205];

bool Check (int arg)
{
    for (int i=0;i<=n;i++)
    {
        for (int j=0;j<=2*l;j++)
        {
            DP[i][j]=-1;
        }
    }
    DP[0][0]=0;
    for (int i=1;i<=n;i++)
    {
        for (int j=0;j<=2*l;j++)
        {
            for (int k=0;k<arg/v[i].first;k++)
            {
                if (k>j)
                    break;
                if (DP[i-1][j-k]==-1)
                    continue;
                if (DP[i-1][j-k]+(arg-k*v[i].first)/v[i].second>DP[i][j])
                {
                    DP[i][j]=max(DP[i][j],DP[i-1][j-k]+(arg-k*v[i].first));
                    pos[i][j]=k;
                }
            }
        }
    }
    for (int i=l;i<=2*l;i++)
    {
        if (DP[n][i]>=l)
            return 1;
    }
    return 0;
}
void Afis(int i,int j)
{
    if (i==0)
        return;
    Afis(i-1,j-pos[i][j]);
    out<<pos[i][j]<<' ';
    out<<(ans-pos[i][j]*v[i].first)/v[i].second<<'\n';
}
void Print()
{
    int p1=0;int p2=0;
    bool ok=Check(ans);
    for (int i=l;i<2*l;i++)
    {
        if (DP[n][i]>=l)
        {
            p1=n;
            p2=i;
            break;
        }
    }
}
int Search_Bin ()
{
    int i,p=0;
    for (i=1;i<=105;i<<=1);
    while (i)
    {
        if (i+p<=105&&Check(i+p)==0)
        {
            p+=i;
        }
        i>>=1;
    }
    return p+1;
}
int main()
{
    in>>n>>l;
    for (int i=1;i<=n;i++)
    {
        in>>v[i].first>>v[i].second;
    }
    ans=Search_Bin();
    out<<ans;
    Print();
    return 0;
}