Pagini recente » Cod sursa (job #426878) | Cod sursa (job #406484) | Cod sursa (job #543638) | Cod sursa (job #1223285) | Cod sursa (job #2865847)
#include <fstream>
#include <cstring>
#include <climits>
using namespace std;
const int NMAX = 103, BIG = 3003, INF = 1000000;
int a[NMAX], b[NMAX], n, l;
int dp[NMAX][NMAX], recon[NMAX][NMAX], last[NMAX][NMAX];
ifstream cin("lapte.in");
ofstream cout("lapte.out");
bool ok(int val)
{
//dp[i][j] = nr. max. de litri de lapte b bauti de i bautori cand ei beau impreuna j litri a
//recon[i][j] = cati litri de lapte a bea al i-lea bautor cand, impreuna, primii i bautori beau j litri a
for (int i = 1; i <= l; i++)
dp[0][i] = -INF;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= l; j++)
{
dp[i][j] = dp[i - 1][j] + val / b[i];
recon[i][j] = 0;
for (int k = j - 1; k >= 0; k--)
{
int need = (val - (j - k) * a[i]) / b[i];
if (val - (j - k) * a[i] < 0)
break;
//dp[i][j] = dp[i - 1][k] +
if (dp[i][j] < dp[i - 1][k] + need)
{
dp[i][j] = dp[i - 1][k] + need;
recon[i][j] = j - k;
}
}
}
return dp[n][l] >= l;
}
pair <int, int> vec[NMAX];
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];
}
/*cout << ok(16);
return 0;*/
int st = 1, dr = BIG, med, sol = -1;
while (st <= dr)
{
med = ((st + dr) >> 1);
if (ok(med))
{
sol = med;
dr = med - 1;
memcpy(last, recon, sizeof(recon));
}
else
st = med + 1;
memset(dp, 0, sizeof(dp));
memset(recon, 0, sizeof(recon));
}
//recon[i][j] = cati litri de lapte a bea al i-lea bautor cand, impreuna, primii i bautori beau j litri a
cout << sol <<"\n";
int val = l;
/*for (i = 1; i <= n; i++)
cout << last[n][l] << " " << (sol - a[i] * last[n][l]) / b[i] << "\n";*/
for (i = n; i >= 1; i--)
{
vec[i] = {last[i][val], (sol - a[i] * last[i][val]) / b[i]};
val -= last[i][val];
}
for (i = 1; i <= n; i++)
cout << vec[i].first << " " << vec[i].second << "\n";
}