Pagini recente » Cod sursa (job #2579897) | Istoria paginii runda/avram_simulare_6/clasament | Cod sursa (job #2470149) | Istoria paginii utilizator/mitocaru_mario | Cod sursa (job #1471656)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int MAX = 105;
int N, L, Tmin;
int a[MAX], b[MAX];
int D[MAX][MAX];
int ta[MAX][MAX];
bool Verif( int t );
void Write( int p, int A );
int main()
{
int i;
int st, dr, mij;
fin >> N >> L;
for ( i = 1; i <= N; i++ )
fin >> a[i] >> b[i];
st = 1, dr = 100;
while ( st < dr )
{
mij = ( st + dr ) / 2;
if ( Verif(mij) )
{
Tmin = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
// bool x = Verif(Tmin);
fout << Tmin << '\n';
Write( N, L );
fin.close();
fout.close();
return 0;
}
bool Verif( int t )
{
int i, j, k;
int nlA, nlB;
int ca, cb;
for ( i = 0; i <= N; i++ )
for ( j = 0; j <= L; j++ )
{
D[i][j] = -1000;
ta[i][j] = 0;
}
D[0][0] = 0;
for ( i = 1; i <= N; i++ )
for ( j = 0; j <= L; j++ )
if ( D[i - 1][j] != -1000 )
{
for ( k = 0; k <= L - j; k++ )
{
nlA = k;
ca = k * a[i];
if ( ca > t )
break;
nlB = ( t - ca ) / b[i];
cb = nlB * b[i];
if ( D[i][j + nlA] < D[i - 1][j] + nlB )
{
D[i][j + nlA] = D[i - 1][j] + nlB;
ta[i][j + nlA] = j;
}
}
}
return D[N][L] > L;
}
void Write( int p, int A )
{
int nlA, nlB;
// if ( A == 0 )
// fout << "DA";
if ( p == 0 )
return;
nlA = A - ta[p][A];
nlB = ( Tmin - ( nlA * a[p] ) ) / b[p];
Write( p - 1, A - nlA );
fout << nlA << ' ' << nlB << '\n';
}