Pagini recente » Cod sursa (job #2074301) | Cod sursa (job #354099) | Cod sursa (job #301269) | Cod sursa (job #3193577) | Cod sursa (job #2405370)
#include <fstream>
#define DMAX 110
std::ifstream fin("lapte.in");
std::ofstream fout("lapte.out");
inline int min(int x, int y) {
return x < y ? x : y;
}
int n, q;
int tA[DMAX], tB[DMAX];
int dp[DMAX][DMAX];
int pr[DMAX][DMAX];
bool check(int time) {
for (int i = 0; i <= n; i++)
for (int j = 0; j <= q; j++)
dp[i][j] = -1;
dp[0][0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= q; j++)
for (int k = 0; k <= min(j, time / tA[i]); k++)
if (dp[i - 1][j - k] != -1 && dp[i - 1][j - k] + (time - k * tA[i]) / tB[i] > dp[i][j]) {
dp[i][j] = dp[i - 1][j - k] + (time - k * tA[i]) / tB[i];
pr[i][j] = k;
}
return dp[n][q] >= q;
}
void solve(int i, int j, int time) {
if (i > 1)
solve(i - 1, j - pr[i][j], time);
fout << pr[i][j] << ' ' << (time - pr[i][j] * tA[i]) / tB[i] << '\n';
}
int main() {
fin >> n >> q;
for (int i = 1; i <= n; i++)
fin >> tA[i] >> tB[i];
int md, lo = 0, hi = 101;
while (hi - lo > 1) {
md = (lo + hi) / 2;
if (check(md))
hi = md;
else
lo = md;
}
fout << hi << '\n';
check(hi);
solve(n, q, hi);
fout.close();
return 0;
}