Cod sursa(job #1106055)

Utilizator MoneaVladMonea Vlad MoneaVlad Data 12 februarie 2014 13:33:06
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("lapte.in");
ofstream out ("lapte.out");

int a[111], b[111], c[111][111], v[111][111], ver[111][111], sol[111], n, l, p, q, t, i, j, k, lmax, x, nr, soltimp;

int main()
{
    in >> n >> l;
    for (i = 1; i <= n; i++)
    {
        in >> a[i] >> b[i];
    }
    q = 101;
    p = 0;
    while (p + 1 < q)
    {
        t = p + (q - p) / 2;
        for (i = 0; i <= 101; i++)
            for (j = 0; j <= 101; j++)
            {
                c[i][j] = 0;
                v[i][j] = 0;
                ver[i][j] = 0;
            }
        for (i = 0; i <= t / a[1]; i++)
        {
            c[1][i] = (t - i * a[1]) / b[1];
            v[1][i] = i;
            ver[1][i] = 1;
        }
        for (i = 2; i <= n; i++)
        {
            for (j = 0; j <= l; j++)
            {
                lmax = -1;
                nr = 0;
                for (k = 0; k <= j; k++)
                {
                    if (a[i] * k <= t)
                    {
                        x = (t - k * a[i]) / b[i];
                        if (c[i - 1][j - k] + x > lmax && ver[i-1][j-k] == 1)
                        {
                            lmax = c[i - 1][j - k] + x;
                            nr = k;
                        }
                    }
                    else break;
                }
                c[i][j] = lmax;
                v[i][j] = nr;
                if (lmax == -1)
                    ver[i][j] = 0;
                else
                    ver[i][j] = 1;

            }
        }
        if (c[n][l] >= l)
        {
            soltimp = t;
            k = l;
            for (i = n; i >= 0; i--)
            {
                sol[i] = v[i][k];
                k -= v[i][k];
            }
            q = t;
        }
        else
            p = t;
    }
    out << soltimp << "\n";
    for (i = 1; i <= n; i++)
    {
        out << sol[i] << " ";
        x = (soltimp - sol[i] * a[i]) / b[i];
        out << x << "\n";
    }
    in.close();
    out.close();
    return 0;
}