Pagini recente » Cod sursa (job #152705) | Cod sursa (job #2547356) | Cod sursa (job #2262622) | Cod sursa (job #2441110) | Cod sursa (job #2514212)
#include <fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
int n,l,st,dr,mid,a[110],b[110],D[110][110],ma[110][110],i;
int ok(int t)
{
int i,j,k,verif=0;
for(i=1; i<=n; i++)
{
for(j=0; j<=l; j++)
{
D[i][j]=-1;
}
}
for(j=0; j<=min(l,t/a[1]); j++)
{
D[1][j]=(t-a[1]*j)/b[1];
ma[1][j]=j;
}
for(i=2; i<=n; i++)
{
for(j=0; j<=min(l,t/a[i]); j++)
{
for(k=0; k<=l-j; k++)
{
if(D[i-1][k]!=-1 && D[i-1][k]+(t-a[i]*j)/b[i]>D[i][j+k])
{
D[i][j+k]=D[i-1][k]+(t-a[i]*j)/b[i];
ma[i][j+k]=j;
if(k+j==l && D[i][j+k]>=l)
verif=1;
}
}
}
}
return verif;
}
void drum(int n, int l)
{
if(n>0)
{
drum(n-1,l-ma[n][l]);
out<<ma[n][l]<<" "<<(st-ma[n][l]*a[n])/b[n]<<'\n';
}
}
int main ()
{
in>>n>>l;
for(i=1; i<=n; i++)
{
in>>a[i]>>b[i];
}
st=1;
dr=100;
while(st<=dr)
{
mid=(st+dr)/2;
if(ok(mid))
dr=mid-1;
else
st=mid+1;
}
out<<st<<'\n';
drum(n,l);
return 0;
}