Cod sursa(job #3185230)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 18 decembrie 2023 16:05:31
Problema Lapte Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N = 200;
int lA[N], lB[N], dp[N][N];

int n, l;

struct sol {
    int a;
    int b;
} ans[N];

int verif ( int t ) {
    
    for ( int i = 0; i <= n; i++ )
        for ( int a = 0; a <= l; a++ )
            dp[i][a] = -1e9;
    
    dp[0][0] = 0;
    
    for ( int i = 1; i <= n; i++ ) {
        for ( int a0 = 0; a0 <= l; a0++ ) {
            for ( int a = 0; a * lA[i] <= t; a++ ) {
                int b = ( t - a * lA[i] ) / lB[i];
                dp[i][a0] = max ( dp[i][a0], dp[i - 1][max(0, a0 - a)] + b );
            }
        }
    }
    if ( dp[n][l] >= l )
        return 1;
    return 0;
}

void reconstituire ( int t ) {
    
    verif ( t );
    
    int a0 = l;
    
    for ( int i = n; i >= 1; i-- ) {
        for ( int a = 0; a * lA[i] <= t; a++ ) {
            int b = ( t - a * lA[i] ) / lB[i];
            if ( a0 - a >= 0 && dp[i - 1][a0 - a] + b == dp[i][a0] ) {
                ans[i].a = a;
                ans[i].b = b;
            }
        }
        a0 -= ans[i].a;
    }
    
    for ( int i = 1; i <= n; i++ )
        fout << ans[i].a << " " << ans[i].b << "\n";
}

int main () {
    
    fin >> n >> l;
    
    for ( int i = 1; i <= n; i++ )
        fin >> lA[i] >> lB[i];
    
    int st = 1, dr = 100;
    
    while ( dr - st > 1 ) {
        int mij = ( dr + st ) / 2;
        
        if ( verif ( mij ) )
            dr = mij - 1;
        else
            st = mij + 1;
    }
    
    fout << dr << "\n";
    
    reconstituire ( dr );
    
    return 0;
}