Pagini recente » Cod sursa (job #1621484) | Cod sursa (job #1526949) | Cod sursa (job #1917398) | Cod sursa (job #2248831) | Cod sursa (job #2398957)
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int NMax = 100, oo = 1e9;
int N, L, A[NMax + 5], B[NMax + 5], DP[NMax + 5][NMax + 5], TT[NMax + 5][NMax + 5];
bool Check(int T)
{
for(int i = 0; i <= N; i++)
for(int j = 0; j <= L; j++)
DP[i][j] = -oo;
DP[0][0] = 0;
for(int i = 1; i <= N; i++)
for(int b = 0; b <= L; b++)
for(int j = 0; j <= b && j * B[i] <= T; j++)
{
int a = (T - j * B[i]) / A[i];
if(DP[i][b] < DP[i - 1][b - j] + a)
DP[i][b] = DP[i - 1][b - j] + a, TT[i][b] = b - j;
}
return (DP[N][L] >= L);
}
int Solve()
{
int Ans = 0;
for(int step = (1 << 7); step > 0; step >>= 1)
if(Ans + step <= 100 && Check(Ans + step) == 0)
Ans += step;
Check(Ans + 1);
return Ans + 1;
}
void Way(int i, int j)
{
if(i > 1) Way(i - 1, TT[i][j]);
if(i >= 1)
fout << DP[i][j] - DP[i - 1][TT[i][j]] << " " << j - TT[i][j] << '\n';
}
int main()
{
fin >> N >> L;
for(int i = 1; i <= N; i++)
fin >> A[i] >> B[i];
fout << Solve() << '\n';
Way(N, L);
fin.close();
fout.close();
return 0;
}