Pagini recente » Cod sursa (job #1207399) | Cod sursa (job #667850) | Cod sursa (job #2140455) | Cod sursa (job #2800334) | Cod sursa (job #1250148)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int NMAX = 100;
const int INF = (1<<30);
struct PAIR{
int x,y;
};
vector <PAIR> sol;
int N, T, L, a[NMAX+3], b[NMAX+3];
int d[NMAX+3][NMAX+3], X[NMAX+3][NMAX+3];
void Dinamica( int timp ) {
memset( d, 0, sizeof(d) );
memset( X, 0, sizeof(X) );
for( int i= 1; i<=L; ++i ) d[0][i]= -INF;
for( int i= 1; i<=N; ++i ) {
for( int j= 0; j<=L; ++j ) {
X[i][j] = 0;
d[i][j] = d[i-1][j] + timp/b[i];
for( int K= 0; K<=timp/a[i] && K<=j; ++K ) {
if( d[i][j] < d[i-1][j-K] + (timp - K*a[i])/b[i] ) {
d[i][j]= d[i-1][j-K] + (timp - K*a[i])/b[i];
X[i][j]= K;
}
}
}
}
}
int Bin_Search() {
int st= 1, dr= L*(a[1]+b[1]);
int last= dr;
while( st<=dr ) {
int mid= (st+dr)/2;
Dinamica( mid );
if( d[N][L] >= L ) {
last= mid;
dr= mid-1;
}
else {
st= mid+1;
}
}
return last;
}
int main() {
in >> N >> L;
for( int i= 1; i<=N; ++i ) {
in >> a[i] >> b[i];
}
T= Bin_Search();
Dinamica( T );
out << T << '\n';
/// Reconstruction
int S= L;
for( int i= N; i>=1; --i ) {
PAIR aux;
aux.x = X[i][S];
aux.y = ( T - X[i][S]*a[i] ) / b[i];
sol.push_back( aux );
S-= X[i][S];
}
for( int i= (int)sol.size()-1; i>=0; --i ) {
out << sol[i].x << ' ' << sol[i].y << '\n';
}
return 0;
}