Pagini recente » Cod sursa (job #2065401) | Cod sursa (job #1907303) | Cod sursa (job #1724691) | Cod sursa (job #1012657) | Cod sursa (job #2204077)
#include <fstream>
#include <algorithm>
const int MAX_N = 100;
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, l, t;
int tA[MAX_N + 1], tB[MAX_N + 1], solA[MAX_N + 1], solB[MAX_N + 1];
int bMax[MAX_N + 1][MAX_N + 1], sePoate[MAX_N + 1][MAX_N + 1];
int verif(int t)
{
for (int i = 1; i <= n; i++)
for (int j = 0; j <= l; j++)
sePoate[i][j]=-1000000000;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= l; j++)
bMax[i][j] = (t - j * tA[i]) / tB[i];
sePoate[0][0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= l; j++)
for (int k = 0 ; k <= j && k * tA[i] <= t; k++)
sePoate[i][j] = max(sePoate[i][j], sePoate[i-1][j-k] + bMax[i][k]);
return sePoate[n][l] >= l;
}
int bs()
{
int st = 1, dr = 100, mij, sol = 0;
while (st <= dr) {
mij = (st + dr) / 2;
if (verif(mij)) {
sol = mij;
dr= mij - 1;
}
else
st = mij + 1;
}
return sol;
}
int main()
{
fin >> n >> l;
for (int i = 1; i <= n; i++)
fin >> tA[i] >> tB[i];
t = bs();
fout << t << '\n';
verif(t);
int ll = l;
for (int i = n; i >= 1; i--)
for (int j = 0; j <= ll && j * tA[i] <=t; j++)
if (sePoate[i-1][ll-j] + bMax[i][j] == sePoate[i][ll]) {
solA[i] = j;
solB[i] = bMax[i][j];
ll-=j;
break;
}
for (int i = 1; i <= n; i++)
fout << solA[i] << " " << solB[i] << '\n';
return 0;
}