Pagini recente » Cod sursa (job #427363) | Cod sursa (job #1689803) | Cod sursa (job #2541220) | Cod sursa (job #2248837) | Cod sursa (job #3191501)
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
int n,L,i,val,st,dr,mid,sol;
int x[101],y[101],t[105][105],D[105][105];
int verif(int timp)
{
///D[i][j]= cantitatea de lapte de tipul b bauta de primii i
///j = cantitatea de lapte de tipul a bauta de primii i
int i,j,k;
for(i=0;i<=104;i++)
for(j=0;j<=104;j++)
t[i][j]=0;
for(i=1;i<=n;i++)
for(j=0;j<=L;j++)
D[i][j]=-1;
for(i=0;i<=L;i++)
if(i*x[1]<=timp)
D[1][i]=(timp-i*x[1])/y[1];
for(i=2;i<=n;i++)
{
for(j=0;j<=L;j++)
{
for(k=0;k<=j;k++)
if(D[i-1][k]!=-1&&(j-k)*x[i]<=timp)
{
int aux=D[i][j];
D[i][j]=max(D[i][j],D[i-1][k]+(timp-(j-k)*x[i])/y[i]);
if(aux!=D[i][j])
t[i][j]=k;
}
}
}
return D[n][L];
}
void R(int X,int Y)
{
if(X||Y)
{
R(X-1,t[X][Y]);
fout<<Y-t[X][Y]<<" "<<(sol-(Y-t[X][Y])*x[X])/y[X]<<"\n";
}
}
int main()
{
fin>>n>>L;
for(i=1;i<=n;i++)
fin>>x[i]>>y[i];
st=0;
dr=100;
while(st<=dr)
{
mid=(st+dr)/2;
val=verif(mid);
if(val>=L)
{
dr=mid-1;
sol=mid;
}
else
st=mid+1;
}
fout<<sol<<"\n";
verif(sol);
R(n,L);
return 0;
}