Cod sursa(job #1749737)

Utilizator antanaAntonia Boca antana Data 28 august 2016 17:38:48
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#define MAX 100

int d[MAX+1][2*MAX+1], a[MAX+1], b[MAX+1], last, l, n, r[MAX+1][2*MAX+1];

inline int dinamica(int t)
{
    int i, j, k, f=0;
    for(j=0;j<=n;++j)
        for(i=0;i<=2*l;++i)
            d[j][i]=-1, r[j][i]=-1;

    d[0][0]=0;
    for(i=1;i<=n;++i)
        for(j=0;j<=2*l;++j)
            for(k=0;k<=j && t-k*a[i]>=0;++k)
                if(d[i-1][j-k] > -1 && d[i][j] < d[i-1][j-k]+(t-k*a[i])/b[i])
                {
                    d[i][j]=d[i-1][j-k]+(t-k*a[i])/b[i];
                    r[i][j]=j-k;
                }

    for(i=l;i<=2*l && !f;++i)
        if(d[n][i] >= l)
            f=i;

    return f;
}

void afisare(int lin, int col)
{
    int x, y;
    if(r[lin][col]!=-1 && lin-1>=1)
        afisare(lin-1, r[lin][col]);

    x=col-r[lin][col];
    y=(last-(x*a[lin]))/b[lin];

    printf("%d %d\n", x, y);
}

int main()
{
    freopen("lapte.in", "r", stdin);
    freopen("lapte.out", "w", stdout);

    int i, st, dr, m, sol;

    scanf("%d%d", &n, &l);

    for(i=1;i<=n;++i)
        scanf("%d%d", &a[i], &b[i]);

    st=1, dr=MAX;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(dinamica(m))
        {
            last=m;
            dr=m-1;
        }
        else st=m+1;
    }

    sol=dinamica(last);

    printf("%d\n", last);

    afisare(n, sol);

    return 0;
}