Pagini recente » Cod sursa (job #1301124) | Cod sursa (job #566263) | Cod sursa (job #3177779) | Cod sursa (job #1611314) | Cod sursa (job #931130)
Cod sursa(job #931130)
#include<cstdio>
#include<cstring>
#define NMax 120
using namespace std;
int D[NMax][NMax],A[NMax],N,L;
int B[NMax],rcst[NMax][NMax];
int check (int T)
{
int i,j,k;
memset(D,-1,sizeof(D));
D[0][0]=0;
for (i=1; i<=N; i++)
for (j=0; j<=L; j++)
for (k=0; k*B[i]<=L && k<=j; k++)
if (D[i-1][j-k]!=-1 && (D[i-1][j-k]+(T-k*B[i])/A[i])>D[i][j])
{
D[i][j]=D[i-1][j-k]+(T-k*B[i])/A[i];
rcst[i][j]=j-k;
}
return (D[N][L]>=L);
}
void afisare (int i, int j)
{
if (!i) return;
afisare (i-1,rcst[i][j]);
printf("%d %d\n",D[i][j]-D[i-1][rcst[i][j]],j-rcst[i][j]);
}
int main ()
{
int lo,hi,mid,i,sol;
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&N,&L);
for (i=1; i<=N; i++)
scanf("%d%d",&A[i],&B[i]);
lo=1, hi=100;
while (hi-lo>1)
{
mid=(lo+hi)/2;
if (check(mid))
hi=mid;
else
lo=mid+1;
}
if (lo && check(lo))
sol=lo;
else
{
check(hi);
sol=hi;
}
printf("%d\n",sol);
afisare(N,L);
return 0;
}