Pagini recente » Cod sursa (job #808435) | Cod sursa (job #1459405) | Cod sursa (job #205234) | Cod sursa (job #757587) | Cod sursa (job #1236508)
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int N, L, sol, A[110], B[110], dp[110][110], drum[110][110];
struct { int x, y; } S[110];
bool Verif(int T)
{
for (int i=0; i<=N; i++)
for (int j=0; j<=L; j++)
dp[i][j] = -1;
dp[0][0] = 0;
for (int i=1; i<=N; i++)
{
for (int j=0; j<=L; j++)
{
for (int k=0; k*A[i]<=T; k++)
{
if(dp[i-1][j-k] < 0) continue;
int timp_a = k * A[i];
int litri_b = (T - timp_a) / B[i];
if (dp[i-1][j-k] + litri_b > dp[i][j])
{
dp[i][j] = dp[i-1][j-k] + litri_b;
drum[i][j] = k;
}
}
}
}
if (dp[N][L] >= L)
{
int nr = L;
for (int i=N; i>=1; i--)
{
S[i].x = drum[i][nr];
S[i].y = (T - S[i].x * A[i]) / B[i];
nr -= S[i].x;
}
return 1;
}
return 0;
}
int main()
{
fin >> N >> L;
for (int i=1; i<=N; i++) fin >> A[i] >> B[i];
int p = 1, u = 100, mij;
while (p <= u)
{
mij = (p + u) / 2;
if (Verif(mij)) u = mij - 1, sol = mij;
else p = mij + 1;
}
fout << sol << '\n';
for (int i=1; i<=N; i++) fout << S[i].x << ' ' << S[i].y << '\n';
fout.close();
return 0;
}