Pagini recente » Cod sursa (job #1529219) | Cod sursa (job #2226598) | Cod sursa (job #2502322) | Cod sursa (job #1812177) | Cod sursa (job #3185237)
#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 <= t / lA[i]; 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 <= t / lA[i]; 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 >= 0 ) {
int mij = ( dr + st ) / 2;
if ( verif ( mij ) )
dr = mij - 1;
else
st = mij + 1;
}
fout << dr + 1 << "\n";
reconstituire ( dr + 1 );
return 0;
}