Pagini recente » Cod sursa (job #287533) | Cod sursa (job #2712876) | Cod sursa (job #1738228) | Cod sursa (job #249726) | Cod sursa (job #611314)
Cod sursa(job #611314)
#include<stdio.h>
#define inf "lapte.in"
#define outf "lapte.out"
#define NMax 101
#define INF 0x3f3f3f3f
using namespace std;
int N, L, T;
int A[NMax], B[NMax];
int C[NMax][NMax], back[NMax][NMax], rez = INF;
void read()
{
scanf("%d%d", &N, &L);
for(int i=1; i<=N; i++) scanf("%d%d", &A[i], &B[i]);
}
void print(int i, int l)
{
if( !i ) return;
print(i-1, l-back[i][l]);
printf("%d %d\n", back[i][l], (T - back[i][l]*A[i])/B[i]);
}
bool PD(int flag) //flag = 0 <-> in binary search; flag = 1 <-> outside binary search
{
for(int i=0; i<=N; i++)
for(int j=0; j<=L; j++) C[i][j] = -INF;
C[0][0] = 0;
for(int i = 1; i<=N; i++)
for(int l=0; l<=L; l++)
{
for(int j=0; ( (j<=l) && (j*A[i]<=T) ) ; j++)
if( C[i][l] < C[i-1][l-j] + (T-j*A[i])/B[i] )
{
C[i][l] = C[i-1][l-j] + (T-j*A[i])/B[i] ;
back[i][l] = j;
}
}
if( C[N][L]>=L )
{
if( flag ) print(N,L);
return true;
}
return false;
}
void solve()
{
int li = 1, ls = NMax-1;
while( li<=ls )
{
T = (li+ls)/2;
if( PD(0) )
{
if( T < rez ) rez = T;
ls = T-1;
}
else li = T+1;
}
T = rez;
printf("%d\n", T);
PD(1);
}
int main()
{
freopen(inf,"r",stdin); freopen(outf,"w",stdout);
read(); solve();
return 0;
}