Cod sursa(job #2514212)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 24 decembrie 2019 19:33:41
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int n,l,st,dr,mid,a[110],b[110],D[110][110],ma[110][110],i;
int ok(int t)
{
    int i,j,k,verif=0;
    for(i=1; i<=n; i++)
    {
        for(j=0; j<=l; j++)
        {
            D[i][j]=-1;
        }
    }
    for(j=0; j<=min(l,t/a[1]); j++)
    {
        D[1][j]=(t-a[1]*j)/b[1];
        ma[1][j]=j;
    }
    for(i=2; i<=n; i++)
    {
        for(j=0; j<=min(l,t/a[i]); j++)
        {
            for(k=0; k<=l-j; k++)
            {
                if(D[i-1][k]!=-1 && D[i-1][k]+(t-a[i]*j)/b[i]>D[i][j+k])
                {
                    D[i][j+k]=D[i-1][k]+(t-a[i]*j)/b[i];
                    ma[i][j+k]=j;
                    if(k+j==l && D[i][j+k]>=l)
                        verif=1;
                }
            }
        }
    }
    return verif;

}
void drum(int n, int l)
{
    if(n>0)
    {
        drum(n-1,l-ma[n][l]);
        out<<ma[n][l]<<" "<<(st-ma[n][l]*a[n])/b[n]<<'\n';
    }
}
int main ()
{
    in>>n>>l;
    for(i=1; i<=n; i++)
    {
        in>>a[i]>>b[i];
    }
    st=1;
    dr=100;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(ok(mid))
            dr=mid-1;
        else
            st=mid+1;
    }
    out<<st<<'\n';
    drum(n,l);
    return 0;
}