Pagini recente » Cod sursa (job #1552489) | Cod sursa (job #420869) | Cod sursa (job #1078614) | Cod sursa (job #534239) | Cod sursa (job #1737576)
#include <fstream>
#include <algorithm>
#define INF 1000000000
using namespace std;
ifstream fi("lapte.in");
ofstream fo("lapte.out");
typedef struct vit{int a, b;} VIT;
VIT A[101];
int S[101][101],R[101][101],n,l,i,t;
int verif(int x)
{
int i,j,k,maxa,maxb;
for(i=0; i<=n; i++)
{
for(j=1; j<=l; j++)
{
R[i][j]=-INF;
}
R[i][0]=0;
}
for(i=1; i<=n; i++)
{
maxa=x/A[i].a;
for(j=0; j<=min(l,maxa); j++)
{
maxb=(x-j*A[i].a)/A[i].b;
for(k=l; k>=j; k--)
{
if(R[i][k]<(R[i-1][k-j]+maxb))
{
R[i][k]=R[i-1][k-j]+maxb;
S[i][k]=j;
}
}
}
}
return R[n][l]>=l;
}
int bs()
{
int st=0;
int dr=100;
int rez=-1;
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
if(verif(mij))
{
rez=mij;
dr=mij-1;
}
else
st=mij+1;
}
return rez;
}
void reconst(int poz, int ltr)
{
if(poz==0)
return;
reconst(poz-1, ltr-S[poz][ltr]);
fo<<S[poz][ltr]<<" "<<(t-A[poz].a*S[poz][ltr])/A[poz].b<<"\n";
}
int main()
{
fi>>n>>l;
for(i=1; i<=n; i++)
{
fi>>A[i].a>>A[i].b;
}
t=bs();
verif(t);
fo<<t<<"\n";
reconst(n,l);
fi.close();
fo.close();
return 0;
}