Pagini recente » Cod sursa (job #1264938) | Cod sursa (job #2578555) | Cod sursa (job #2184909) | Cod sursa (job #1294113) | Cod sursa (job #896464)
Cod sursa(job #896464)
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
struct matrice
{
int val,a,b;
};
matrice m[101][101];
int n,l,a[101],b[101],tok[101],t,x,y,ok,trecut[101],a1[101],b1[101];
void ver ()
{
int i,j,k,bc;
trecut[t]=1;
for (i=0;i<=n;i++)
for (j=0;j<=l;j++)
m[i][j].val=-1;
for (j=0;j<=t/a[1];j++)
m[1][j].val=(t-j*a[1])/b[1];
for (i=2;i<=n;i++)
{
for (j=0;j<=l;j++)
{
for (k=0;k<=j&&k*a[i]<=t;k++)
{
if (m[i-1][j-k].val!=-1)
{
bc=(t-k*a[i])/b[i]+m[i-1][j-k].val;
if (bc>=m[i][j].val)
{
m[i][j].val=bc;
if (ok==1)
{
m[i][j].a=k;
m[i][j].b=(t-k*a[i])/b[i];
}
}
}
}
}
}
if (m[n][l].val<l)
{
tok[t]=1;
x=t+1;
}
else y=t-1;
}
int main()
{
int i,k,j;
fin>>n>>l;
for (i=1;i<=n;i++)
fin>>a[i]>>b[i];
x=1;
y=100;
tok[0]=1;
do
{
if (tok[t-1]==1&&tok[t]==0) break;
if (tok[t-1]==1&&tok[t]==1&&trecut[t+1]==1)
{
t++;
break;
}
t=(x+y)>>1;
ver ();
}
while (!ok);
ok=1;
ver ();
k=l;
for (i=n;i>=2;i--)
{
b1[i]=m[i][k].b;
a1[i]=m[i][k].a;
k-=m[i][k].a;
}
b1[i]=m[i][k].val;
a1[i]=k;
fout<<t<<'\n';
for (i=1;i<=n;i++)
fout<<a1[i]<<' '<<b1[i]<<'\n';
fin.close ();
fout.close ();
return 0;
}