Pagini recente » Cod sursa (job #3134465) | Cod sursa (job #1072509) | Cod sursa (job #2196434) | Cod sursa (job #2225369) | Cod sursa (job #1112093)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int INF = 0x3f3f3f3f;
int N, L;
int T, sol[101][101];
int lapteA[101], lapteB[101];
int dp[101][101], constr[101][101];
int solve(int timp)
{
memset(dp, -INF, sizeof(dp));
memset(constr, 0, sizeof(constr));
dp[0][0] = 0;
for (int i = 1; i <= N; ++i)
for (int j = 0; j <= L; ++j)
for (int k = 0; k <= j && k * lapteB[i] <= timp; ++k)
{
if (dp[i - 1][j - k] + (timp - k * lapteB[i]) / lapteA[i] > dp[i][j])
{
dp[i][j] = dp[i - 1][j - k] + (timp - k * lapteB[i]) / lapteA[i];
constr[i][j] = k;
}
}
if (dp[N][L] >= L)
return 1;
return 0;
}
void cb()
{
int l = 0, r = 101;
while (r - l > 1)
{
int mid = (l + r) / 2;
if (solve(mid))
{
r = mid;
memcpy(sol, constr, sizeof(constr));
T = mid;
}
else
l = mid;
}
}
void lala()
{
for (int i = 1; i <= 100; ++i)
if (solve(i))
{
T = i;
memcpy(sol, constr, sizeof(constr));
break;
}
}
void afisare(int i, int j)
{
if (i == 0)
return;
afisare(i - 1, j - sol[i][j]);
fout << (T - sol[i][j] * lapteB[i]) / lapteA[i] << ' ' << sol[i][j] << '\n';
}
int main()
{
fin >> N >> L;
for (int i = 1; i <= N; ++i)
fin >> lapteA[i] >> lapteB[i];
cb();
fout << T << '\n';
afisare(N, L);
fin.close();
fout.close();
return 0;
}