Pagini recente » Cod sursa (job #378493) | Cod sursa (job #1677706) | Cod sursa (job #2381522) | Cod sursa (job #1939850) | Cod sursa (job #1316308)
#include<fstream>
using namespace std;
const int NMAX= 100, inf= ( 1<<30 );
ifstream in( "lapte.in" );
ofstream out( "lapte.out" );
struct milk
{
int a, b;
};
milk v[NMAX+1];
int N, L, ans, d[NMAX+1][NMAX+1], mrasp[NMAX+1][NMAX+1], vrasp[NMAX+1];
bool verificare( int x )
{
for( int i = 0; i<=N; ++i )
{
for( int j = 0; j<=L; ++j )
{
d[i][j] = -inf;
}
}
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].a<=x; k++)
{
int aux = ( x - k * v[i].a ) / v[i].b;
if( d[i][j]<d[i - 1][j - k] + aux )
{
d[i][j] = d[i - 1][j - k] + aux;
mrasp[i][j] = k;
}
}
}
}
if( d[N][L]>=L )
return 1;
else
return 0;
}
int caut_binar()
{
int hi = NMAX+1, lo = -1, mid;
while(hi - lo>1)
{
mid = (hi + lo) / 2;
if( verificare(mid)==1 && verificare(mid - 1)==0 )
return mid;
if( verificare(mid)==1 )
hi = mid;
else
lo = mid;
}
if (verificare(mid)==1 && verificare(mid - 1)==0 )
return mid;
if( verificare(hi)==1 && verificare(hi - 1)==0 )
return hi;
if( verificare(lo)==1 && verificare(lo - 1)==0 )
return lo;
return 0;
}
int main()
{
in >> N >> L;
for( int i = 1; i<=N; ++i )
{
in >> v[i].a >> v[i].b;
}
ans = caut_binar();
verificare(ans);
out << ans << '\n';
int aux = N;
while( aux!=0 )
{
vrasp[aux] = mrasp[aux][L];
L -= mrasp[aux][L];
--aux;
}
for( int i= 1; i<=N; ++i )
{
out << vrasp[i] << ' ' << ( ans - vrasp[i] * v[i].a ) / v[i].b << '\n';
}
return 0;
}