Pagini recente » Cod sursa (job #1035829) | Cod sursa (job #651623) | Cod sursa (job #1185229) | Cod sursa (job #2405232) | Cod sursa (job #1120563)
#include <fstream>
using namespace std;
int n, L, va[110], vb[110], sol, bestB[110][110], pred[110][110], A[110], B[110];
inline bool Posibil(int T)
{
int i, j, k;
for(i = 0; i <= n; ++i)
for(j = 0; j <= L; ++j)
{
bestB[i][j] = -1000000000;
pred[i][j] = 0;
}
bestB[0][0] = 0;
for(i = 1; i <= n; ++i)
{
for(j = 0; j <= L; ++j)
{
for(k = 0; k <= j; ++k)
{
if(T - (j - k) * va[i] >= 0)
{
if(bestB[i][j] < bestB[i - 1][k] + (T - (j - k) * va[i]) / vb[i])
{
bestB[i][j] = bestB[i - 1][k] + (T - (j - k) * va[i]) / vb[i];
pred[i][j] = k;
}
}
}
}
}
if(bestB[n][L] >= L)
return true;
return false;
}
inline void CautareBinara()
{
int st, dr, mij;
st = 1;
dr = 100;
while(st <= dr)
{
mij = (st + dr) / 2;
if(Posibil(mij))
{
sol = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
}
int main()
{
int i, j, k;
ifstream fin("lapte.in");
fin >> n >> L;
for(i = 1; i <= n; ++i)
fin >> va[i] >> vb[i];
fin.close();
CautareBinara();
Posibil(sol);
i = n;
j = L;
while(i)
{
k = pred[i][j];
A[i] = j - k;
B[i] = bestB[i][j] - bestB[i - 1][k];
j = k;
i--;
}
ofstream fout("lapte.out");
fout << sol << "\n";
for(i = 1; i <= n; ++i)
fout << A[i] << ' ' << B[i] << "\n";
fout.close();
return 0;
}