Pagini recente » Cod sursa (job #2674628) | Cod sursa (job #2714184) | Cod sursa (job #2215004) | Cod sursa (job #1623860) | Cod sursa (job #1058418)
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int inf= 1<<30;
const int nmax= 100;
const int xmax= nmax*nmax;
int n, l;
int ta[nmax+1], tb[nmax+1];
int a[nmax+1], b[nmax+1], d[nmax+1][nmax+1], p[nmax+1][nmax+1];
int check( int t ) {
for ( int i= 0; i<=nmax; ++i ) {
for ( int j= 0; j<=nmax; ++j ) {
d[i][j]= -inf;
}
}
d[0][0]= 0;
for ( int i= 0; i<=n-1; ++i ) {
for ( int j= 0; j<=l; ++j ) {
for ( int k= 0; k<=l; ++k ) {
if ( d[i][j]!=-inf && k*ta[i+1]<=t ) {
int x= (t-k*ta[i+1])/tb[i+1];
if ( d[i+1][j+k]<d[i][j]+x ) {
d[i+1][j+k]= d[i][j]+x;
p[i+1][j+k]= k;
}
}
}
}
}
if ( d[n][l]>=l ) {
return 1;
} else {
return 0;
}
}
int main( ) {
fin>>n>>l;
for ( int i= 1; i<=n; ++i ) {
fin>>ta[i]>>tb[i];
}
int n2;
for ( n2= 1; n2<= xmax; n2<<= 1 ) {
}
int sol= xmax;
for ( int step= n2; step>0; step>>= 1 ) {
if ( sol-step>=1 && check(sol-step)==1 ) {
sol-= step;
}
}
fout<<sol<<"\n";
for ( int i= n; i>=1; l-= p[i][l], --i ) {
a[i]= p[i][l];
b[i]= (sol-ta[i]*a[i])/tb[i];
}
for ( int i= 1; i<=n; ++i ) {
fout<<a[i]<<" "<<b[i]<<"\n";
}
return 0;
}