Pagini recente » Cod sursa (job #524809) | Cod sursa (job #3349013) | Cod sursa (job #521832) | Cod sursa (job #1783693) | Cod sursa (job #3334786)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int MAXN = 102;
int N, L;
int d[MAXN][MAXN], p[MAXN][MAXN];
int A[MAXN], B[MAXN];
bool verif(int cost_max) {
for (int j = 0; j <= L; ++j)
d[0][j] = INT_MIN;
d[0][0] = 0;
for (int i = 1; i <= N; ++i) {
for (int j = 0; j <= L; ++j) {
d[i][j] = INT_MIN;
for (int t = 0; t <= j && t * A[i] <= cost_max; ++t) {
if (d[i][j] < d[i - 1][j - t] + (cost_max - t * A[i]) / B[i]) {
d[i][j] = d[i - 1][j - t] + (cost_max - t * A[i]) / B[i];
p[i][j] = t;
}
}
}
}
return d[N][L] >= L;
}
void afis(int i, int j, int cost_max) {
if (i == 0) return;
const int cnt_a = p[i][j];
const int cnt_b = (cost_max - cnt_a * A[i]) / B[i];
afis(i - 1, j - cnt_a, cost_max);
fout << cnt_a << ' ' << cnt_b << '\n';
}
int main()
{
fin >> N >> L;
for (int i = 1; i <= N; ++i) {
fin >> A[i] >> B[i];
}
int ans = 0;
for (int i = 8; i >= 0; --i)
if (!verif(ans + (1 << i))) ans += (1 << i);
++ans;
verif(ans);
fout << ans << '\n';
afis(N, L, ans);
return 0;
}