Pagini recente » Cod sursa (job #2743042) | Cod sursa (job #2523974) | Cod sursa (job #1556950) | Cod sursa (job #1646197) | Cod sursa (job #2428818)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int N = 105;
int n, g, i, st, dr, mid;
int a[N], b[N];
int dp[N][N], t[N][N];
bool check (int p)
{
int i, j, k;
bool ok = false;
for (i=1; i<=n; i++)
{
for (j=0; j<=g; j++)
{
dp[i][j] = -1;
}
}
for (j=0; j<=min(g, p/a[1]); j++)
{
dp[1][j] = (p-a[1]*j)/b[1];
t[1][j] = j;
}
for (i=2; i<=n; i++)
{
for (j=0; j<=min(g, p/a[i]); j++)
{
for (k=0; k<=g-j; k++)
{
if (dp[i-1][k] != -1)
{
if (dp[i][k+j] < dp[i-1][k] + (p-a[i]*j)/b[i])
{
dp[i][k+j] = dp[i-1][k] + (p-a[i]*j)/b[i];
t[i][k+j] = j;
if (k + j == g && dp[i][k+j] >= g)
{
ok = true;
}
}
}
}
}
}
return ok;
}
void path(int n, int g)
{
if (n > 0)
{
path (n-1, g - t[n][g]);
out << t[n][g] << " " << (st - t[n][g]*a[n])/b[n] << "\n";
}
}
int main()
{
in >> n >> g;
for (i=1; i<=n; i++)
{
in >> a[i] >> b[i];
}
st = 1, dr = g*(a[1] + b[1]);
while (st <= dr)
{
mid = st + (dr - st)/2;
if (check (mid))
{
dr = mid - 1;
}
else
{
st = mid + 1;
}
}
out << st << "\n";
check (st);
path (n, g);
return 0;
}