Pagini recente » Cod sursa (job #1335188) | Cod sursa (job #2092261) | Cod sursa (job #2808111) | Cod sursa (job #979252) | Cod sursa (job #1253258)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int NMAX=100;
const int INFINITE=(1<<30);
struct PAIR
{
int x,y;
};
int n, l, t;
int a[NMAX+3], b[NMAX+3];
int d[NMAX+3][NMAX+3], X[NMAX+3][NMAX+3];
vector <PAIR> sol;
void Din(int timp)
{
memset(d, 0, sizeof(d));
memset(X, 0, sizeof(X));
for(int i=1;i<=l;++i)
d[0][i]=-INFINITE;
for(int i=1;i<=n;i++)
for(int j=0;j<=l;j++)
{
X[i][j]=0;
d[i][j]=d[i-1][j]+timp/b[i];
for(int K=0;K<=timp/a[i] && K<=j;K++)
if(d[i][j]<d[i-1][j-K]+(timp-K*a[i])/b[i])
{
d[i][j]=d[i-1][j-K]+(timp-K*a[i])/b[i];
X[i][j]=K;
}
}
}
int bs()
{
int st=1, dr=l*(a[1]+b[1]);
int last=dr;
while(st<=dr)
{
int mid=(st+dr)/2;
Din(mid);
if(d[n][l]>=l)
{
last=mid;
dr=mid-1;
}
else st=mid+1;
}
return last;
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d%d", &n, &l);
for(int i=1;i<=n;i++)
scanf("%d%d", &a[i], &b[i]);
t=bs();Din(t);
printf("%d\n", t);
int s=l;
for(int i=n;i>0;i--)
{
PAIR aux;
aux.x=X[i][s];
aux.y=(t-X[i][s]*a[i])/b[i];
sol.push_back(aux);
s-=X[i][s];
}
for(int i=sol.size()-1;i>=0;i--)
printf("%d %d\n", sol[i].x, sol[i].y);
return 0;
}