Pagini recente » Cod sursa (job #2334715) | Cod sursa (job #1813438) | Cod sursa (job #772089) | Cod sursa (job #1314520) | Cod sursa (job #2113383)
#include <fstream>
#define DEF 110
#define INF 1 << 29
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int D[DEF][DEF], A[DEF], B[DEF], n, l;
pair < int , int > sol[DEF];
bool calc (int T) {
for (int i = 0; i < DEF; ++ i) {
for (int j = 0; j < DEF; ++ j) {
D[i][j] = - INF;
}
}
D[0][0] = 0;
for (int i = 1; i <= n; ++ i) {
for (int j = 0; j <= l; ++ j) {
for (int k = 0; k <= T / A[i] && k <= j; ++ k) {
int b = (T - k * A[i]) / B[i];
if (D[i][j] < D[i - 1][j - k] + b) {
D[i][j] = D[i - 1][j - k] + b;
}
}
}
}
return D[n][l] >= l;
}
void reb (int t) {
for (int i = n; i >= 1; -- i) {
for (int k = 0; k <= t / A[i]; ++ k) {
if (D[i][l] == D[i - 1][l - k] + (t - k * A[i]) / B[i]) {
sol[i].first = k;
sol[i].second = (t - k * A[i]) / B[i];
l -= k;
break;
}
}
}
}
int main() {
fin >> n >> l;
for (int i = 1; i <= n; ++ i) {
fin >> A[i] >> B[i];
}
int st = 1, dr = 100, mid;
while (st <= dr) {
mid = (st + dr) / 2;
if (calc (mid)) {
dr = mid - 1;
}
else {
st = mid + 1;
}
}
calc (st);
reb (st);
fout << st << "\n";
for (int i = 1; i <= n; ++ i) {
fout << sol[i].first << " " << sol[i].second << "\n";
}
return 0;
}