Cod sursa(job #1258723)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 9 noiembrie 2014 12:31:38
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<cstdio>

using namespace std;

FILE *fin = fopen( "lapte.in" , "r" ), *fout = fopen( "lapte.out" , "w" );
/// d[ i ][ j ] = nr de L de B, daca primii i beau j L de A in total
const int nmax = 100;
const int inf = 1 << 30;
const int lmax = 200;
int n, l, a[ nmax + 1 ], b[ nmax + 1 ];
int d[ nmax + 1 ][ lmax + 1 ], sol[ nmax + 1 ][ lmax + 1 ];

void init() {
    for( int i = 1; i <= n; ++ i ) {
        for( int j = 0; j <= l; ++ j ) {
            d[ i ][ j ] = 0;
        }
    }
    for( int i = 1; i <= l; ++ i ) {
        d[ 0 ][ i ] = -inf;
    }
}
bool check( int t ) {
    d[ 0 ][ 0 ] = 0;
    init();
    for( int i = 1; i <= n; ++ i ) {
        for( int j = 0; j <= l; ++ j ) {
            for( int k = 0; k <= l && k <= j && k * a[ i ] <= t; ++ k ) {
                int bl = ( t - k * a[ i ] ) / b[ i ];
                if ( d[ i ][ j ] < d[ i - 1 ][ j - k ] + bl ) {
                    d[ i ][ j ] = d[ i - 1 ][ j - k ] + bl;
                    sol[ i ][ j ] = k;
                }
            }
        }
    }
    return ( d[ n ][ l ] >= l );
}
void afis( int t, int i, int j ) {
    if ( i == 0 ) {
        return ;
    }
    afis( t, i - 1, j - sol[ i ][ j ] );
    fprintf( fout, "%d %d\n", sol[ i ][ j ], (t - sol[ i ][ j ]) / b[ i ] );
}
int main() {
    int sol;
    fscanf( fin, "%d%d", &n, &l );
    for( int i = 1; i <= n; ++ i ) {
        fscanf( fin, "%d%d", &a[ i ], &b[ i ] );
    }
    sol = 1 << 30;
    for( int step = 1 << 30; step > 0; step >>= 1 ) {
        if ( check( sol - step ) ) {
            sol -= step;
        }
    }
    fprintf( fout, "%d\n", sol );
    check( sol );
    afis( sol, n, l );
    fclose( fin );
    fclose( fout );
    return 0;
}