Pagini recente » Cod sursa (job #1945683) | Cod sursa (job #3272179) | Cod sursa (job #3001014) | Cod sursa (job #510443) | Cod sursa (job #1169452)
#include <cstring>
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
const int N = 105;
int n, L, A[N], B[N], knap[N][N], rknap[N][N], t[N][N], rt[N][N];
bool go(int x) {
memset (knap, -1, sizeof(knap));
knap[0][0] = 0;
for (int i = 1; i <= n; ++i)
for (int j = 0; j <= L; ++j)
for (int k = 0; k <= x / B[i] && k <= j; ++k)
if (knap[i-1][j-k] != -1 && knap[i-1][j-k] + (x - k * B[i]) / A[i] > knap[i][j]) {
knap[i][j] = knap[i-1][j-k] + (x - k * B[i]) / A[i];
t[i][j] = j - k;
}
if (knap[n][L] >= L) {
memcpy (rknap, knap, sizeof(knap));
memcpy (rt, t, sizeof(t));
return 1;
}
return 0;
}
void write(int i, int j) {
if (!i)
return;
write (i-1, rt[i][j]);
fout << rknap[i][j] - rknap[i-1][rt[i][j]] << " " << j - rt[i][j] << "\n";
}
int main() {
fin >> n >> L;
for (int i = 1; i <= n; ++i)
fin >> A[i] >> B[i];
int sol = 1 << 22;
for (int step = 1 << 22; step; step >>= 1)
if (go (sol - step))
sol -= step;
fout << sol << "\n";
write (n, L);
}