Pagini recente » Cod sursa (job #2790960) | Cod sursa (job #1679755) | Cod sursa (job #1575691) | Cod sursa (job #2281633) | Cod sursa (job #761579)
Cod sursa(job #761579)
#include <cstdio>
using namespace std;
const int maxn = 105;
int n, p, l, reconst[maxn][maxn], d[maxn][maxn], a[maxn], b[maxn], sol, raspa[maxn], raspb[maxn];
int verifica(int x)
{
int i, j, k;
for(i = 0; i <= n; ++i)
for(j = 0; j <= l; ++j) {
d[i][j] = -1;
reconst[i][j] = 0;
}
d[0][0] = 0;
for(i = 1; i <= n; ++i) {
for(j = 0; j <= l; ++j) {
for(k = 0; k <= j; ++k) {
if(d[i - 1][k] != -1 && (j - k) * a[i] <= x)
if(d[i - 1][k] + (x - (j - k) * a[i]) / b[i] > d[i][j]) {
d[i][j] = d[i - 1][k] + (x - (j - k) * a[i]) / b[i];
reconst[i][j] = k;
}
}
}
}
if(d[n][l] >= l)
return 1;
return 0;
}
void cauta()
{
int left = 1, right = 101, mij;
while(left <= right) {
mij = (left + right) / 2;
if(verifica(mij)) {
sol = mij;
right = mij - 1;
}
else left = mij + 1;
}
}
int main()
{
int i;
freopen ("lapte.in", "r", stdin);
freopen ("lapte.out", "w", stdout);
scanf("%d %d", &n, &l);
for(i = 1; i <= n; ++i)
scanf("%d %d", &a[i], &b[i]);
cauta();
printf("%d\n", sol);
verifica(sol);
p = l;
for(i = n; i >= 1; --i) {
raspa[i] = reconst[i][p];
raspb[i] = (sol - raspa[i] * a[i]) / b[i];
p -= raspa[i];
}
/*for(i = n; i >= 1; --i) {
raspa[i] = p - reconst[i][p];
raspb[i] = d[i][p] - d[i - 1][reconst[i][p]];
p = reconst[i][p];
} */
for(i = 1; i <= n; ++i)
printf("%d %d\n", raspa[i], raspb[i]);
return 0;
}