Pagini recente » Cod sursa (job #2843470) | Cod sursa (job #1753571) | Cod sursa (job #1516039) | Cod sursa (job #1016151) | Cod sursa (job #827288)
Cod sursa(job #827288)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("lapte.in");
ofstream out ("lapte.out");
const int MAXN = 111;
int N, L;
int A[MAXN], B[MAXN];
int D[MAXN][MAXN];
int Reconst[MAXN][MAXN];
inline int _max (const int &A, const int &B)
{
if (A > B)
return A;
return B;
}
inline bool ok (int T)
{
int i, j, k;
for (i = 0; i < MAXN; i ++)
for (j = 0; j < MAXN; j ++)
D[i][j] = -1;
D[0][0] = 0;
for (i = 1; i <= N; i ++)
for (j = 0; j <= L; j ++)
for (k = 0; k <= T / B[i] && k <= j; k ++)
if (D[i - 1][j - k] != -1 && (D[i - 1][j - k] + (T - k * B[i]) / A[i]) > D[i][j]){
D[i][j] = D[i - 1][j - k] + (T - k * B[i]) / A[i];
Reconst[i][j] = j - k;
}
return (D[N][L] >= L);
}
int BS ()
{
int step = (1 << 8), res = MAXN;
for ( ; step; step >>= 1)
if (res - step >= 1 && ok (res - step))
res -= step;
return res;
}
void Afis (int i, int j)
{
if (!i)
return;
Afis (i - 1, Reconst[i][j]);
out << D[i][j] - D[i - 1][ Reconst[i][j] ] << " " << j - Reconst[i][j] << "\n";
}
int main ()
{
int i, Ans;
in >> N >> L;
for (i = 1; i <= N; i ++)
in >> A[i] >> B[i];
Ans = BS ();
out << Ans << "\n";
Ans = ok (Ans);
Afis (N, L);
return 0;
}