Pagini recente » Cod sursa (job #3297077) | Cod sursa (job #1503013) | Cod sursa (job #2906628) | Cod sursa (job #75498) | Cod sursa (job #2443616)
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 105;
const int INF = (1 << 30);
int speeda[NMAX], speedb[NMAX];
pair <int, int> milk[NMAX][NMAX];
int n, l;
bool Check(int xtime)
{
vector < vector <int> > dp(n + 1, vector <int> (l + 1, -INF));
dp[0][0] = 0;
for (int i = 1;i <= n;++i)
for (int milka = 0;milka <= l && milka * speeda[i] <= xtime;++milka)
{
int milkb = (xtime - milka * speeda[i]) / speedb[i];
for (int j = milka;j <= l;++j)
if (dp[i][j] < dp[i - 1][j - milka] + milkb)
{
milk[i][j] = make_pair(milka, milkb);
dp[i][j] = dp[i - 1][j - milka] + milkb;
}
}
return dp[n][l] >= l;
}
int main()
{
ifstream fin("lapte.in");
ofstream fout("lapte.out");
fin >> n >> l;
for (int i = 1;i <= n;++i)
fin >> speeda[i] >> speedb[i];
int left = 1, right = 100, mid, ans = -1;
while (left <= right)
{
mid = (left + right) / 2;
if (Check(mid))
{
ans = mid;
right = mid - 1;
}
else
left = mid + 1;
}
fout << ans << "\n";
Check(ans);
for (int i = n, pos = l;i >= 1;pos -= milk[i][pos].first, --i)
fout << milk[i][pos].first << " " << milk[i][pos].second << "\n";
fin.close();
fout.close();
return 0;
}