Cod sursa(job #2755301)

Utilizator cristia_razvanCristia Razvan cristia_razvan Data 26 mai 2021 23:09:04
Problema Lapte Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>
using namespace std;

using ll = long long;


const string filename = "lapte";

ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

const int mxn = 100;

int n, L;
pair<int, int> a[mxn + 5];
int dp[mxn + 5][mxn + 5];
pair<int, int> ac[mxn + 5][mxn + 5], sol[mxn + 5][mxn + 5];
vector<pair<int, int> > fnl;
bool f(int t)
{
	for (int i = 0; i <= n; ++i)
		for (int j = 0; j <= L; ++j)
			dp[i][j] = -2e9;
	dp[0][0] = 0;
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= L; ++j)
			for (int x = 0; x <= j; ++x)
			{
				int y = (t - x * a[i].first) / a[i].second;
				if (x * a[i].first <= t && dp[i - 1][j - x] >= 0 && dp[i - 1][j - x] + y > dp[i][j])
				{
					dp[i][j] = dp[i - 1][j - x] + y;
					ac[i][j] = {x, y};
				}
			}
	return dp[n][L] >= L;

}

int main()
{
	int ans = 0;
	fin >> n >> L;

	for (int i = 1; i <= n; ++i)
		fin >> a[i].first >> a[i].second;

	int st = 1, dr = 1000000, mid;

	while (st <= dr)
	{
		mid = (st + dr) >> 1;
		if (f(mid))
		{
			ans = mid;
			dr = mid - 1;
			for (int i = 1; i <= n; ++i)
				for (int j = 0; j <= L; ++j)
					sol[i][j] = ac[i][j];
		}
		else st = mid + 1;
	}
	fout << ans << '\n';

	int i = n, j = L;
	while (i && ~j)
	{
		fnl.push_back(sol[i][j]);
		j -= sol[i][j].first;
		i--;
	}

	reverse(fnl.begin(), fnl.end());
	for (auto i : fnl)
		fout << i.first << " " << i.second << "\n";
	fin.close();
	fout.close();
	return 0;
}