Pagini recente » Cod sursa (job #2466606) | Cod sursa (job #2128910) | Cod sursa (job #1422152) | Cod sursa (job #2598260) | Cod sursa (job #2755621)
#include <bits/stdc++.h>
#define N 108
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, L;
int T;
int vA[N], vB[N];
pair<int, int> Lapte[N][N];
pair<int, int> A[N][N];
void Citire()
{
int i;
fin >> n >> L;
for( i=1; i<=n; i++ )
fin >> vA[i] >> vB[i];
}
int DP[N][N];
/// dp[i][j] = maximul de lapte B din care am baut pana acum j litri de lapte A intre primele i persoane
bool Verif( int t )
{
int i, j;
int x, y;
for( i=0; i<=n; i++ )
for( j=0; j<=L; j++ )
DP[i][j] = -2e9;
DP[0][0] = 0;
for( i=1; i<=n; i++ )
for( j=0; j<=L; j++ )
for( x=0; x<=j; x++ )
if( x * vA[i] <= t )
{
y = (t - x * vA[i]) / vB[i];
if( DP[i - 1][j - x] + y > DP[i][j] )
{
DP[i][j] = DP[i - 1][j - x] + y;
A[i][j] = { x, y };
}
}
/*
if( t == 18 )
{
for( i=1; i<=n; i++, cout << "\n" )
for( j=0; j<=L; j++ )
cout << DP[i][j] << " ";
cout << "\n\n";
}
*/
return DP[n][L] >= L;
}
void Transfer( pair<int, int> A[][N], pair<int, int>B[][N] )
{
int i, j;
for( i=1; i<=n; i++ )
for( j=0; j<=L; j++ )
A[i][j].first = B[i][j].first,
A[i][j].second = B[i][j].second;
}
int CB( int st, int dr )
{
int mid;
int t = 100;
while( st <= dr )
{
mid = ( st + dr ) / 2;
if( Verif( mid ) )
{
t = mid;
dr = mid - 1;
Transfer( Lapte, A );
}
else{
st = mid + 1;
}
}
return t;
}
stack<pair<int, int>> sol;
int Rezolvare()
{
int i, j;
T = CB( 1, 100 );
fout << T << "\n";
/*
for( i=1; i<=n; i++, cout << "\n\n" )
for( j=0; j<=L; j++ )
cout << Lapte[i][j].first << " " << Lapte[i][j].second << "\t";
*/
i = n; j = L;
for( int k = 1; k <= n; k++ )
{
sol.push( Lapte[i][j] );
j -= Lapte[i][j].first;
i--;
}
while( !sol.empty() )
{
fout << sol.top().first << " " << sol.top().second << "\n";
sol.pop();
}
}
int main()
{
Citire();
Rezolvare();
fin.close();
fout.close();
return 0;
}