Pagini recente » Cod sursa (job #1115453) | Cod sursa (job #742608) | Cod sursa (job #293116) | Cod sursa (job #1600607) | Cod sursa (job #980783)
Cod sursa(job #980783)
#include<fstream>
#define N 105
#define inf -(1<<28)
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int D[N][N],a[N],b[N],A[N][N],B[N][N],sol1[N],sol2[N],st,dr,mij,j,i,l,ca,cb,n,sol,x,y;
int check(int T)
{
for(i=0;i<=n;++i)
for(j=0;j<=l;++j)
D[i][j]=inf;
D[0][0]=0;
for(i=1;i<=n;++i)
for(ca=0;ca*a[i]<=T;++ca)
{
cb=(T-ca*a[i])/b[i];
for(j=0;j<=l;++j)
if(j+ca<=l)
{
if(D[i][j+ca]<D[i-1][j]+cb)
{
D[i][j+ca]=D[i-1][j]+cb;
A[i][j+ca]=ca; B[i][j+ca]=cb;
}
}
else
if(D[i][l]<D[i-1][j]+cb)
{
D[i][l]=D[i-1][j]+cb;
A[i][l]=ca; B[i][l]=cb;
}
}
if(D[n][l]>=l)
{
x=n; y=l;
while(x)
{
sol1[x]=A[x][y]; sol2[x]=B[x][y];
y-=A[x][y]; x--;
}
return 1;
}
return 0;
}
int main ()
{
f>>n>>l;
for(i=1;i<=n;++i)
f>>a[i]>>b[i];
st=1;
dr=100;
while(st<=dr)
{
mij=(st+dr)>>1;
if(check(mij))
{
dr=mij-1;
sol=mij;
}
else
st=mij+1;
}
g<<sol<<"\n";
for(i=1;i<=n;++i)
g<<sol1[i]<<" "<<sol2[i]<<"\n";
return 0;
}