Pagini recente » Cod sursa (job #598728) | Cod sursa (job #1835375) | Cod sursa (job #3126460) | Cod sursa (job #1831641) | Cod sursa (job #1230403)
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
const int NMAX = 105, INF = 2e9;
int n, l, last[NMAX][NMAX], d[NMAX][NMAX], a[NMAX], b[NMAX], solA[NMAX], solB[NMAX];
bool vis[NMAX];
bool check (int t) {
int i, j, A, B;
memset(last, 0, sizeof(last));
memset(d, 0, sizeof(d));
for(A = 1; A <= l; ++ A)
d[0][A] = -INF;
for(i = 1; i <= n; ++ i)
for(j = 0; j <= l; ++ j) {
last[i][j] = 0;
d[i][j] = d[i - 1][j] + t / b[i];
for(A = 1; A <= j && A * a[i] <= t; ++ A) {
B = (t - A * a[i]) / b[i];
if(d[i - 1][j - A] + B > d[i][j]) {
d[i][j] = d[i - 1][j - A] + B;
last[i][j] = A;
}
}
}
return d[n][l] >= l;
}
int bs (int right) {
int left, mid, sol;
left = 1;
while(left <= right) {
mid = (left + right) / 2;
if(check(mid)) {
sol = mid;
right = mid - 1;
}
else
left = mid + 1;
}
return sol;
}
void buildSol(int t) {
int i, j;
j = l;
for(i = n; i >= 1; -- i) {
solA[i] = last[i][j];
solB[i] = (t - a[i] * solA[i]) / b[i];
j -= solA[i];
}
}
int main() {
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
int i, t;
scanf("%d%d", &n, &l);
for(i = 1; i <= n; ++ i)
scanf("%d%d", &a[i], &b[i]);
t = bs(100);
buildSol(t);
printf("%d\n", t);
for(i = 1; i <= n; ++ i)
printf("%d %d\n", solA[i], solB[i]);
return 0;
}