Pagini recente » Cod sursa (job #2862819) | Cod sursa (job #152995) | Cod sursa (job #212281) | Cod sursa (job #2961735) | Cod sursa (job #2865509)
#include <fstream>
#include <cstring>
using namespace std;
const int NMAX = 103, BIG = 200003;
int a[NMAX], b[NMAX], n, l;
pair <int, int> last[BIG][NMAX], dp[BIG][NMAX], dplast[BIG][NMAX];
ifstream cin("lapte.in");
ofstream cout("lapte.out");
int ok(int val)
{
int mx = 0;
for (int i = 1; i <= n; i++)
{
int last = mx;
for (int k = 0; k * a[i] <= val; k++)
if ((val - k * a[i]) % b[i] == 0)
{
int nr = (val - k * a[i]) / b[i];
for (int j = 0; j <= last; j++)
{
if (dplast[j][0].first + nr > dplast[j + k][0].first)
{
dp[j + k][0].first = dplast[j][0].first + nr;
for (int ind = 1; ind < i; ind++)
dp[j + k][ind] = dplast[j][ind];
dp[j + k][i] = {k, nr};
}
else
{
dp[j + k][0].first = dplast[j + k][0].first;
for (int ind = 1; ind < i; ind++)
dp[j + k][ind] = dplast[j + k][ind];
}
if (dp[j + k][0].first != 0)
mx = max(mx, j + k);
}
}
memcpy(dplast, dp, sizeof(dp));
}
for (int i = l; i <= mx; i++)
if (dp[i][0].first >= l)
return i;
return -1;
}
int main()
{
int i, s = 0;
cin >> n >> l;
for (i = 1; i <= n; i++)
{
cin >> a[i] >> b[i];
s += a[i] * l + b[i] * l;
}
int st = 1, dr = s, med, sol = -1, care = 0;
while (st <= dr)
{
med = ((st + dr) >> 1);
int val = ok(med);
if (val != -1)
{
sol = med;
care = val;
dr = med - 1;
memcpy(last, dp, sizeof(dp));
}
else
st = med + 1;
memset(dplast, 0, sizeof(dplast));
memset(dp, 0, sizeof(dp));
}
cout << sol <<"\n";
for (i = 1; i <= n; i++)
cout << last[care][i].first << " " << last[care][i].second << "\n";
}