Pagini recente » Cod sursa (job #1411943) | Cod sursa (job #1629840) | Cod sursa (job #1598834) | Cod sursa (job #614311) | Cod sursa (job #2398749)
#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 = (1 << 10) - 1;
for(int step = (1 << 10); step > 0; step >>= 1)
if(Ans - step > 0)
Ans -= Check(Ans - step) * step;
return Ans;
}
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;
}