Cod sursa(job #1258743)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 9 noiembrie 2014 13:08:21
Problema Lapte Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<cstdio>

using namespace std;

FILE *fin = fopen( "lapte.in" , "r" ), *fout = fopen( "lapte.out" , "w" );

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