Pagini recente » Cod sursa (job #944665) | Cod sursa (job #1504528) | Cod sursa (job #70485) | Cod sursa (job #1266252) | Cod sursa (job #1347485)
#include <cstdio>
#include <cstring>
using namespace std;
#define Nmax 102
#define inf 0x3f3f3f3f
FILE *f = fopen ( "lapte.in" , "r" );
FILE *g = fopen ( "lapte.out" , "w" );
int D[Nmax][Nmax], prev[Nmax][Nmax], N, L, sl;
struct bautor{
int A, B;
}v[Nmax];
bool isSol ( int T ){
memset ( D, -inf, sizeof ( D ) );
memset ( prev, 0, sizeof ( prev ) );
D[0][0] = 0;
for ( int i = 0; i < N; ++i )
for ( int j = 0; j <= L; ++j )
for ( int k = 0; j + k <= L && k * v[i+1].A <= T; ++k ){
int val = D[i][j] + ( T - k * v[i+1].A ) / v[i+1].B;
if ( val > D[i+1][j+k] ){
D[i+1][j+k] = val;
prev[i+1][j+k] = j;
}
}
return D[N][L] >= L;
}
void Afisare ( int x, int y ){
if ( x == 0 ){
fprintf ( g, "%d\n", sl );
return;
}
Afisare ( x - 1, prev[x][y] );
int a = y - prev[x][y];
int b = ( sl - a * v[x].A ) / v[x].B;
fprintf ( g, "%d %d\n", a, b );
}
int main(){
int step;
fscanf ( f, "%d%d", &N, &L );
for ( int i = 1; i <= N; ++i )
fscanf ( f, "%d%d", &v[i].A, &v[i].B );
/*for ( step = 1; step < L; step <<= 1 );
for ( sl = L; step ; step >>= 1 )
if ( sl - step > 0 && isSol ( sl - step ) )
sl -= step;
*/
int st = 1, dr = 100, mid;
while ( st <= dr ){
mid = ( st + dr ) >> 1;
if ( isSol ( mid ) ){
sl = mid;
dr = mid - 1;
}
else
st = mid + 1;
}
isSol ( sl );
Afisare ( N, L );
return 0;
}