Pagini recente » Cod sursa (job #642666) | Cod sursa (job #380531) | Cod sursa (job #171138) | Cod sursa (job #2473789) | Cod sursa (job #561244)
Cod sursa(job #561244)
#include <iostream>
#include <string>
using namespace std;
#define NM 105
#define inf 1000000000
int N, L, A[NM], B[NM], LMAX[NM][NM], C[NM][NM], ANS[NM][2];
int posibil(int timp)
{
for (int l = 1; l <= L; ++l) LMAX[0][l] = -inf;
for (int i = 1; i <= N; ++i)
{
for (int l = 0; l <= L; ++l) LMAX[i][l] = -inf;
for (int l = 0; l <= L; ++l)
for (int c = 0; c <= l; ++c)
{
if (c * A[i] > timp) break;
if (LMAX[i][l] < (int)(LMAX[i-1][l-c] + (timp - c * A[i])/B[i]))
{
LMAX[i][l] = LMAX[i-1][l-c] + (timp - c * A[i])/B[i];
C[i][l] = c;
}
}
}
if (LMAX[N][L] >= L) return 1;
return 0;
}
int main()
{
freopen ("lapte.in", "r", stdin);
freopen ("lapte.out", "w", stdout);
scanf ("%d %d", &N, &L);
for (int i = 1; i <= N; ++i) scanf ("%d %d", &A[i], &B[i]);
int tmin = 1, tmax = 100;
while (tmin < tmax)
{
int tmid = (tmin + tmax)/2;
if (posibil(tmid)) tmax = tmid;
else tmin = tmid + 1;
}
int ans = tmin;
printf ("%d\n", ans);
for (int i = N; i >= 1; --i)
{
ANS[i][0] = C[i][L];
ANS[i][1] = (ans - C[i][L]*A[i])/B[i];
L -= C[i][L];
}
for (int i = 1; i <= N; ++i) printf ("%d %d\n", ANS[i][0], ANS[i][1]);
return 0;
}