Pagini recente » Cod sursa (job #2883570) | Cod sursa (job #1602112) | Cod sursa (job #358269) | Cod sursa (job #1574781) | Cod sursa (job #2709640)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
struct elem {
int a, b;
};
int n, l, dp[150][150], aux[150][150], difa, difb;
elem v[159];
bool rezolva(int t) {
for (int i = 0; i <= l; ++i) {
dp[1][i] = INT_MIN;
if (v[1].a * i > t)
continue;
dp[1][i] = (t - v[1].a * i) / v[1].b;
aux[1][i] = 0;
}
for (int i = 2; i <= n; ++i) {
for (int j = 0; j <= l; ++j) {
dp[i][j] = INT_MIN;
for (int k = 0; k <= j; ++k){
if (v[i].a * (j - k) <= t) {
if (dp[i][j] < dp[i - 1][k] + (t - v[i].a * (j - k)) / v[i].b) {
dp[i][j] = dp[i - 1][k] + (t - v[i].a * (j - k)) / v[i].b;
}
}
}
}
}
if (dp[n][l] >= l)
return 1;
return 0;
}
void afisare (int n, int l) {
if (n != 1)
afisare (n - 1, aux[n][l]);
fout << l - difa << ' ' << dp[n][l] - difb << '\n';
difa = l;
difb = dp[n][l];
}
int main()
{
fin >> n >> l;
for (int i = 1; i <= n; ++i) {
fin >> v[i].a >> v[i].b;
}
int st = 1, dr = 150;
while (st <= dr) {
int mid = (st + dr) / 2;
if (rezolva(mid)) {
dr = mid - 1;
}
else st = mid + 1;
}
fout << st << '\n';
for (int i = 0; i <= l; ++i) {
dp[1][i] = INT_MIN;
if (v[1].a * i > st)
continue;
dp[1][i] = (st - v[1].a * i) / v[1].b;
}
for (int i = 2; i <= n; ++i) {
for (int j = 0; j <= l; ++j) {
dp[i][j] = INT_MIN;
for (int k = 0; k <= j; ++k){
if (v[i].a * (j - k) <= st) {
if (dp[i][j] < dp[i - 1][k] + (st - v[i].a * (j - k)) / v[i].b) {
dp[i][j] = dp[i - 1][k] + (st - v[i].a * (j - k)) / v[i].b;
aux[i][j] = k;
}
}
}
}
}
afisare(n, l);
return 0;
}