Pagini recente » Cod sursa (job #1579753) | Cod sursa (job #506824) | Cod sursa (job #26216) | Cod sursa (job #2395084) | Cod sursa (job #2070486)
#include <fstream>
#include <climits>
using namespace std;
ifstream cin("lapte.in");
ofstream cout("lapte.out");
const int N_MAX = 100;
int n, L;
int va[1 + N_MAX], vb[1 + N_MAX];
int la[1 + N_MAX], lb[1 + N_MAX];
int sol[1 + N_MAX][1 + N_MAX];
int main()
{
cin >> n >> L;
for(int i = 1; i <= n; i++)
cin >> va[i] >> vb[i];
int st = 1, dr = 100, mj;
while(st <= dr)
{
mj = (st + dr) / 2;
for(int i = 0; i <= n; i++)
for(int j = 0; j <= L; j++)
sol[i][j] = INT_MIN;
sol[0][0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= L; j++)
for(int k = 0; k <= min(j, mj / va[i]); k++)
sol[i][j] = max(sol[i][j], sol[i - 1][j - k] + (mj - va[i] * k) / vb[i]);
if(sol[n][L] < L)
st = mj + 1;
else
dr = mj - 1;
}
cout << st << "\n";
for(int i = 0; i <= n; i++)
for(int j = 0; j <= L; j++)
sol[i][j] = INT_MIN;
sol[0][0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= L; j++)
for(int k = 0; k <= min(j, st / va[i]); k++)
sol[i][j] = max(sol[i][j], sol[i - 1][j - k] + (st - va[i] * k) / vb[i]);
int j = L;
for(int i = n; i >= 1; i--)
for(int k = 0; k <= min(j, st / va[i]); k++)
{
if(sol[i - 1][j - k] + (st - va[i] * k) / vb[i] == sol[i][j])
{
la[i] = k;
lb[i] = (st - va[i] * k) / vb[i];
j -= k;
break;
}
}
for(int i = 1; i <= n; i++)
cout << la[i] << " " << lb[i] << "\n";
return 0;
}