Cod sursa(job #1471656)

Utilizator borcanirobertBorcani Robert borcanirobert Data 14 august 2015 19:45:38
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include <cstring>
using namespace std;

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

const int MAX = 105;
int N, L, Tmin;
int a[MAX], b[MAX];
int D[MAX][MAX];
int ta[MAX][MAX];

bool Verif( int t );
void Write( int p, int A );

int main()
{
    int i;
    int st, dr, mij;

    fin >> N >> L;
    for ( i = 1; i <= N; i++ )
        fin >> a[i] >> b[i];

    st = 1, dr = 100;
    while ( st < dr )
    {
        mij = ( st + dr ) / 2;

        if ( Verif(mij) )
        {
            Tmin = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
 //   bool x = Verif(Tmin);

    fout << Tmin << '\n';
    Write( N, L );

    fin.close();
    fout.close();
    return 0;
}

bool Verif( int t )
{
    int i, j, k;
    int nlA, nlB;
    int ca, cb;

    for ( i = 0; i <= N; i++ )
        for ( j = 0; j <= L; j++ )
        {
            D[i][j] = -1000;
            ta[i][j] = 0;
        }

    D[0][0] = 0;
    for ( i = 1; i <= N; i++ )
        for ( j = 0; j <= L; j++ )
            if ( D[i - 1][j] != -1000 )
            {
                for ( k = 0; k <= L - j; k++ )
                {
                    nlA = k;
                    ca = k * a[i];

                    if ( ca > t )
                        break;

                    nlB = ( t - ca ) / b[i];
                    cb = nlB * b[i];

                    if ( D[i][j + nlA] < D[i - 1][j] + nlB )
                    {
                        D[i][j + nlA] = D[i - 1][j] + nlB;
                        ta[i][j + nlA] = j;
                    }
                }
            }
    return D[N][L] > L;
}

void Write( int p, int A )
{
    int nlA, nlB;

 //   if ( A == 0 )
      //  fout << "DA";

    if ( p == 0 )
        return;

    nlA = A - ta[p][A];
    nlB = ( Tmin - ( nlA * a[p] ) ) / b[p];

    Write( p - 1, A - nlA );

    fout << nlA << ' ' << nlB << '\n';
}