Pagini recente » Cod sursa (job #1175750) | Cod sursa (job #1825769) | Cod sursa (job #124091) | Cod sursa (job #1643790) | Cod sursa (job #1513697)
#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);
memset(K, 0, sizeof K);
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;
}
void reconstituie(int n, int s, int last) {
if(n) {
int cantA = K[n][s], cantB = (last - cantA * a[n]) / b[n];
reconstituie(n - 1, s - cantA, last);
printf("%d %d\n", cantA, cantB);
}
}
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);
reconstituie(N, L, last);
return 0;
}