Pagini recente » Cod sursa (job #2587679) | Cod sursa (job #2666336) | Cod sursa (job #45094) | Cod sursa (job #822779) | Cod sursa (job #474618)
Cod sursa(job #474618)
#include <fstream>
using namespace std;
int v[1<<7][1<<7];
int n,l,a[1<<7],b[1<<7];
ifstream in("lapte.in");
ofstream out("lapte.out");
bool ok(int x)
{
int i,j,k,q;
for (i=0;i<=100;i++)
for (j=0;j<=100;j++)
v[i][j]=-1;
for (i=x/a[1];i>=0;i--)
v[1][i]=(x-a[1]*i)/b[1];
for (i=2;i<=n;i++)
for (j=x/a[i];j>=0;j--)
{
q=(x-a[i]*j)/b[i];
for (k=0;k<=100-j;k++)
if (v[i-1][k]!=-1)
{
v[i][k]=max(v[i][k],v[i-1][k]);
v[i][k+j]=max(v[i][j+k],q+v[i-1][k]);
}
}
for (i=l;i<=100;i++)
if (v[n][i]>=l)
return true;
return false;
}
int bsearch()
{
int i,step=1<<6;
for (i=0;step;step>>=1)
if (!ok(i+step))
i+=step;
return i+1;
}
void redo(int x,int y,int t)
{
int i,q;
if (!x)
return;
if (x==1)
{
out<<y<<" "<<v[1][y]<<"\n";
return;
}
for (i=t/a[x];i>=0;i--)
{
q=(t-a[x]*i)/b[x];
if (y>=i && v[x-1][y-i]!=-1 && v[x][y]-v[x-1][y-i]==q)
{
redo(x-1,y-i,t);
out<<i<<" "<<q<<"\n";
return;
}
}
}
int main()
{
int i,j,q,k,x;
in>>n>>l;
for (i=1;i<=n;i++)
in>>a[i]>>b[i];
x=bsearch();
for (i=0;i<=100;i++)
for (j=0;j<=100;j++)
v[i][j]=-1;
for (i=x/a[1];i>=0;i--)
v[1][i]=(x-a[1]*i)/b[1];
for (i=2;i<=n;i++)
for (j=x/a[i];j>=0;j--)
{
q=(x-a[i]*j)/b[i];
for (k=0;k<=100-j;k++)
if (v[i-1][k]!=-1)
{
v[i][k]=max(v[i][k],v[i-1][k]);
v[i][k+j]=max(v[i][j+k],q+v[i-1][k]);
}
}
out<<x<<"\n";
for (i=l;i<=100;i++)
if (v[n][i]>=l)
{
redo(n,i,x);
break;
}
return 0;
}