Pagini recente » Cod sursa (job #713442) | Cod sursa (job #2006296) | Cod sursa (job #422640) | Cod sursa (job #3136605) | Cod sursa (job #1258743)
#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;
}