Pagini recente » Cod sursa (job #2120372) | Cod sursa (job #2376190) | Cod sursa (job #1334722) | Cod sursa (job #641121) | Cod sursa (job #1849880)
#include <fstream>
#include <vector>
using namespace std;
int N,L;
int A[101],B[101];
int dp[101][101];
int pre[101][101];
bool can(int T)
{
for (int i = 0; i <= 100; i++)
for (int j = 0; j <= 100; j++)
dp[i][j] = -1000000000;
dp[0][0] = 0;
for (int i = 1; i <= N; i++)
{
for (int j = 0; j <= L; j++)
{
for (int k = 0; k <= T / A[i] && k <= j; k++)
{
if (dp[i][j] < dp[i-1][j-k] + (T - k * A[i]) / B[i])
{
dp[i][j] = dp[i-1][j-k] + (T - k * A[i]) / B[i];
pre[i][j] = k;
}
}
}
}
if (dp[N][L] >= L) return 1;
return 0;
}
int main()
{
ifstream fin("lapte.in");
ofstream fout("lapte.out");
fin >> N >> L;
for (int i = 1; i <= N; i++)
fin >> A[i] >> B[i];
int l = 1,r = 100;
while (l != r)
{
int mid = (l + r) / 2;
if (can(mid))
r = mid;
else l = mid + 1;
}
can(l);
int T = l;
vector< pair<int,int> > ans;
for (int i = N,j = L; i >= 1; j -= pre[i][j], i--)
ans.push_back(make_pair(pre[i][j],(T - pre[i][j] * A[i]) / B[i]));
fout << T << "\n";
for (int i = N; i >= 1; i--)
fout << ans[i-1].first << " " << ans[i-1].second << "\n";
}