Pagini recente » Cod sursa (job #2020708) | Cod sursa (job #968639) | Cod sursa (job #2915748) | Cod sursa (job #1524372) | Cod sursa (job #1514094)
#include <cstdio>
#include <cstring>
const int maxN = 105;
const int inf = 10000000000;
int N, L, a[maxN + 3], b[maxN + 3];
int d[maxN + 3][maxN + 3], K[maxN + 3][maxN + 3];
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) {
d[i][j] = d[i - 1][j] + T / b[i];
for(register int k = 0; k <= j and k * a[i] <= T; ++ k) {
int f = d[i - 1][j - k] + (T - k * a[i]) / b[i];
if(d[i][j] < f)
d[i][j] = f,
K[i][j] = k;
}
}
}
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 = 100, 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;
}
printf("%d\n", last);
dinamica(last);
reconstituie(N, L, last);
return 0;
}