Pagini recente » Cod sursa (job #74293) | Cod sursa (job #1266101) | Cod sursa (job #1665497) | Cod sursa (job #2766310) | Cod sursa (job #2865525)
#include <fstream>
#include <cstring>
using namespace std;
const int NMAX = 103, BIG = 3003;
int a[NMAX], b[NMAX], n, l;
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 and j + k <= BIG; j++)
{
if (dplast[j][0] + nr > dplast[j + k][0])
{
dp[j + k][0] = dplast[j][0] + nr;
for (int ind = 1; ind < i; ind++)
dp[j + k][ind] = dplast[j][ind];
dp[j + k][i] = k;
}
else
for (int ind = 0; ind < i; ind++)
dp[j + k][ind] = dplast[j + k][ind];
if (dp[j + k][0] != 0)
mx = max(mx, j + k);
}
}
memcpy(dplast, dp, sizeof(dp));
}
for (int i = l; i <= mx; i++)
if (dp[i][0] >= l)
return i;
return -1;
}
int main()
{
/*cout << (sizeof(last)+sizeof(dp)+sizeof(dplast)+sizeof(a)+sizeof(b))/1024.0;
return 0;*/
int i;
cin >> n >> l;
for (i = 1; i <= n; i++)
{
cin >> a[i] >> b[i];
}
int st = 1, dr = BIG, 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] << " " << (sol - last[care][i] * a[i]) / b[i] << "\n";
}