Pagini recente » Cod sursa (job #638079) | Cod sursa (job #1714007) | Cod sursa (job #1732067) | Cod sursa (job #2681296) | Cod sursa (job #1276223)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("lapte.in");
ofstream os("lapte.out");
int N, L, x, y, Sol;
int D[101][101];
int T[101][101];
vector <pair<int,int> > V;
void Input();
void BinarySearch();
bool Check(int x);
void Output(int x, int y);
int main()
{
Input();
BinarySearch();
is.close();
os.close();
}
void Input()
{
is >> N >> L;
for ( int i = 1; i <= N; ++i )
{
is >> x >> y;
V.push_back(make_pair(x,y));
}
}
bool Check(int x)
{
for ( int i = 0; i <= N; ++i )
for ( int j = 0; j <= L; ++j )
D[i][j] = -10000;
D[0][0] = 0;
for ( int i = 1; i <= N; ++i)
{
for ( int j = 0; j <= L; ++j )
for ( int k = 0; k <= j && k * V[i-1].first <= x; ++k )
{
if ( D[i][j] <= D[i-1][j-k] + (x-k * V[i-1].first)/V[i-1].second)
{
D[i][j] = D[i-1][j-k] + (x-k * V[i-1].first)/V[i-1].second;
T[i][j] = k;
}
}
}
return D[N][L] >= L;
}
void BinarySearch()
{
int hi(100), lo(1), mid;
while ( lo < hi)
{
mid = (lo + hi)/2;
if ( Check(mid) )
hi = mid;
else
lo = mid+1;
}
Sol = hi;
os << Sol << '\n';
Check(hi);
Output(L,N);
}
void Output(int x, int y)
{
if ( y == 0 ) return;
Output(x - T[y][x], y - 1);
os << T[y][x] << " " << (Sol - T[y][x] *V[y-1].first)/V[y-1].second << '\n';
}