Pagini recente » Cod sursa (job #2562593) | Cod sursa (job #2556931) | Cod sursa (job #3272398) | Cod sursa (job #228301) | Cod sursa (job #2574756)
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int dp[105][105], tt[105][105], n, l;
int a[105], b[105];
bool Check(int t) {
for (int i = 0; i <= n; i++)
for (int j = 0; j <= l; j++)
dp[i][j] = -1000000;
dp[0][0] = 0;
for (int i = 1; i <= n; i++)
for (int k = 0; k <= l; k++)
for (int j = 0; j <= k; j++) {
if (j * b[i] > t)
break;
int p = (t - j * b[i]) / a[i];
if (dp[i][k] < dp[i - 1][k - j] + p) {
dp[i][k] = dp[i - 1][k - j] + p;
tt[i][k] = k - j;
}
}
return (dp[n][l] >= l);
}
int Solve() {
int l = 1, r = 100;
int sol = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (Check(mid) == 0) {
sol = mid;
l = mid + 1;
} else r = mid - 1;
}
return sol + 1;
}
void Solve2(int i, int j) {
if (i > 1)
Solve2(i - 1, tt[i][j]);
if (i >= 1)
fout << dp[i][j] - dp[i - 1][tt[i][j]] << " " << j - tt[i][j] << '\n';
}
int main() {
fin >> n >> l;
for (int i = 1; i <= n; i++)
fin >> a[i] >> b[i];
fout << Solve() << '\n';
Solve2(n, l);
}