Cod sursa(job #2113498)

Utilizator LauraNaduLaura Nadu LauraNadu Data 24 ianuarie 2018 17:35:20
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, i, l, a[103], b[103], st, dr, mij, j, t, k, d[103][103];
pair<int, int> sol[103];
bool dinamica(int t)
{
    for(int i=0;i<103;i++)
        for(int j=0;j<103;j++)
            d[i][j]=-100;
    d[0][0]=0;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=l;j++)
            for(int k=0;k<=t/a[i] && k<=j;k++)
            {
                int x=(t-k*a[i])/b[i];
                if(d[i][j]<d[i-1][j-k]+x)
                    d[i][j]=d[i-1][j-k]+x;
            }
    if(d[n][l]>=l)
        return 1;
    return 0;
}
void solutie(int t)
{
    for(int i=n;i>0;i--)
        for(int k=0;k<=t/a[i];k++)
        {
            int x=(t-k*a[i])/b[i];
            if(d[i][l]==d[i-1][l-k]+x)
            {
                sol[i].first=k;
                sol[i].second=x;
                l-=k;
                break;
            }
        }
}
int main()
{
    f>>n>>l;
    for(i=1;i<=n;i++)
        f>>a[i]>>b[i];
    st=1;
    dr=100;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(dinamica(mij)==1)
            dr=mij-1;
        else st=mij+1;
    }
    dinamica(st);
    solutie(st);
    g<<st<<"\n";
    for(i=1;i<=n;i++)
        g<<sol[i].first<<" "<<sol[i].second<<"\n";
    return 0;
}