Pagini recente » Cod sursa (job #1037960) | Cod sursa (job #841435) | Cod sursa (job #779893) | Cod sursa (job #1259124) | Cod sursa (job #2432420)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int DIM = 107;
const int INF = 1e5;
int a[DIM];
int b[DIM];
int dp[DIM][DIM];
int from[DIM][DIM];
int n, l;
bool check(int timp)
{
for(int i = 0; i <= n; i++)
for(int j = 0; j <= l; j++)
dp[i][j] = -INF;
dp[0][0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= l && j * a[i] <= timp; j++)
for(int p = 0; j + p <= l; p++)
if(dp[i][j + p] < dp[i - 1][p] + (timp - j * a[i]) / b[i])
{
dp[i][j + p] = dp[i - 1][p] + (timp - j * a[i]) / b[i];
from[i][j + p] = j;
}
return (dp[n][l] >= l);
}
int ans;
void afiseaza(int n, int l)
{
int x = from[n][l];
int y = (ans - x * a[n]) / b[n];
if(n != 1)
{
afiseaza(n - 1, l - x);
}
out << x << ' ' << y << '\n';
}
int main()
{
in >> n >> l;
for(int i = 1; i <= n; i++)
in >> a[i] >> b[i];
int st = 1;
int dr = 100;
while(st <= dr)
{
int mid = (st + dr) / 2;
if(check(mid))
{
dr = mid - 1;
ans = mid;
}
else
{
st = mid + 1;
}
}
check(ans);
out << ans << '\n';
afiseaza(n, l);
}