Pagini recente » Cod sursa (job #2743735) | Cod sursa (job #1963212) | Cod sursa (job #1917024) | Cod sursa (job #3198535) | Cod sursa (job #1513692)
#include <bits/stdc++.h>
using namespace std;
const int maxN = 100;
const int inf = 10000000000;
int N, L, a[maxN + 3], b[maxN + 3];
int d[maxN + 3][maxN + 3], K[maxN + 3][maxN + 3];
inline int formula(int i, int j, int k, int T) {
return d[i - 1][j - k] + (T - k * a[i]) / b[i];
}
void dinamica(int T) {
memset(d, 0, sizeof d);
for(register int i = 1; i <= L; ++ i)
d[0][i] = -inf;
for(register int i = 1; i <= N; ++ i)
for(register int j = 0; j <= L; ++ j) {
K[i][j] = 0;
d[i][j] = formula(i, j, 0, T);
for(register int k = 0; k <= j and k * a[i] <= T; ++ k) {
int f = formula(i, j, k, T);
if(d[i][j] < f)
d[i][j] = f,
K[i][j] = k;
}
}
}
inline bool ok(int var) {
dinamica(var);
return d[N][L] >= L;
}
int main(void) {
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d %d", &N, &L);
for(register int i = 1; i <= N; ++ i)
scanf("%d %d", &a[i], &b[i]);
int st = 1, dr = inf, last = dr;
while(st <= dr) {
int mid = (st + dr) >> 1;
dinamica(mid);
if(d[N][L] >= L)
last = mid,
dr = mid - 1;
else
st = mid + 1;
}
deque<pair<int, int>> Ans;
printf("%d\n", last);
dinamica(last);
int lCurent = L;
for(register int i = N; i > 0; -- i) {
int cantA = K[i][lCurent], cantB = (last - cantA * a[i]) / b[i];
Ans.push_front(make_pair(cantA, cantB));
lCurent -= K[i][lCurent];
}
for(auto it = Ans.begin(); it != Ans.end(); ++ it)
printf("%d %d\n", it->first, it->second);
return 0;
}