Pagini recente » Cod sursa (job #1743872) | Cod sursa (job #737374) | Cod sursa (job #877885) | Cod sursa (job #2665442) | Cod sursa (job #1480492)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int MAXN = 100, INF = 2000000000;
int a[MAXN+1], b[MAXN+1], N, L, dp[MAXN+1][MAXN+1], cnt[MAXN+1][MAXN+1];
void citire()
{
in>>N>>L;
for(int i = 1; i <= N; i++)
in>>a[ i ]>>b[ i ];
}
void dinamica(int T)
{
dp[ 0 ][ 0 ] = 0;
for(int i = 1; i <= MAXN; i++)
dp[ 0 ][ i ] = -INF;
for(int i = 1; i <= N; i++)
{
for(int j = 0; j <= MAXN; j++)
{
dp[ i ][ j ] = 0;
for(int k = 0; j - k >= 0 && T - k*a[ i ] >= 0; k++)
{
int q = ( T - k*a[ i ] ) / b[ i ];
if( dp[ i ][ j ] < dp[ i - 1 ][ j - k ] + q )
{
dp[ i ][ j ] = dp[ i - 1 ][ j - k ] + q;
cnt[ i ][ j ] = k;
}
}
}
}
}
void rec(int i, int j, int T)
{
if(i || j )
{
rec( i - 1, j - cnt[ i ][ j ], T );
out<<cnt[ i ][ j ]<<' '<<( T - cnt[ i ][ j ]*a[ i ] ) / b[ i ]<<endl;
}
}
int answer;
void solve(int left, int right)
{
if( left > right )
return;
int m = ( left + right ) / 2;
dinamica( m );
if( dp[ N ][ L ] >= L )
{
answer = m;
solve(left, m - 1);
}
else solve(m + 1,right);
}
int main()
{
citire();
solve(0, a[ 1 ]*L + b[ 1 ]*L);
out<<answer<<endl;
//rec(N,L,answer);
return 0;
}