Pagini recente » Cod sursa (job #742249) | Cod sursa (job #1667519) | Cod sursa (job #1626595) | Cod sursa (job #1272818) | Cod sursa (job #1420044)
#include <fstream>
#include <cstring>
using namespace std;
const int kMaxN = 130;
int N, L;
pair<int, int> p[kMaxN];
int d[kMaxN][kMaxN];
int q[kMaxN][kMaxN];
int tmin, ans[kMaxN];
int& A(int i) {
return p[i].first;
}
int& B(int i) {
return p[i].second;
}
void Read() {
ifstream fin("lapte.in");
fin >> N >> L;
for (int i = 1; i <= N; ++i)
fin >> A(i) >> B(i);
}
bool Check(int T) {
memset(d, -1, sizeof d);
for (int i = 0; i <= L && i * A(1) <= T; ++i)
d[1][i] = (T - i * A(1)) / B(1);
for (int i = 2; i <= N; ++i)
for (int j = 0; j <= L; ++j)
for (int k = 0; k <= j && k * A(i) <= T; ++k)
if (d[i - 1][j - k] >= 0) {
int nw = d[i - 1][j - k] + (T - k * A(i)) / B(i);
if (nw > d[i][j]) {
d[i][j] = nw;
q[i][j] = k;
}
}
return d[N][L] >= L;
}
void Solve() {
for (int step = 64; step; step >>= 1)
if (!Check(tmin | step))
tmin |= step;
++tmin;
Check(tmin);
for (int i = N, sum = L; i; --i) {
ans[i] = q[i][sum];
sum -= ans[i];
}
}
void Print() {
ofstream fout("lapte.out");
fout << tmin << "\n";
for (int i = 1; i <= N; ++i)
fout << ans[i] << " " << (tmin - ans[i] * A(i)) / B(i) << "\n";
}
int main() {
Read();
Solve();
Print();
return 0;
}