Cod sursa(job #777525)
#include<fstream>
using namespace std;
typedef struct q{int x,y;}tip;
int sol[101][101],dr[101][101],ta[101],tb[101],n,l;
tip rez[101];
bool ok(int time){
int i,j,k,la,lb;
for(i=0; i<=n; ++i)
for(j=1; j<=l; ++j){ sol[i][j]=-1; dr[i][j]=0; }
for(i=0; i<=n; ++i) {sol[i][0]=0, dr[i][0]=0; }
for(i=1; i<=n; ++i)
for(j=0; j<=l; ++j)
for(k=0; k<=time/ta[i] && k<=j; ++k){
if (sol[i-1][j-k]<0) continue;
la=k*ta[i];
lb=(time-la)/tb[i];
if (sol[i][j]<sol[i-1][j-k]+lb){
sol[i][j]=sol[i-1][j-k]+lb;
dr[i][j]=k;
}
}
if (sol[n][l]>=l){
j=l;
for(int i=n; i>=1; --i){
rez[i].x=dr[i][j];
rez[i].y = (time-rez[i].x*ta[i])/tb[i];
j-=rez[i].x;
}
return 1;
}
else return 0;
}
int cauta(int left,int right){
int mid;
while (left<=right) {
mid=(left+right)/2;
if (ok(mid)) right=mid-1; else left=mid+1;
}
return(left);
}
int main(void){
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int i,max=0;
fin>>n>>l;
for (i=1; i<=n; ++i){fin>>ta[i]>>tb[i]; if (ta[i]>max) max=ta[i]; else if (tb[i]>max) max=tb[i];}
fout<<cauta(1,max*l)<<"\n";
for (i=1; i<=n; ++i) fout<<rez[i].x<<" "<<rez[i].y<<"\n";
return(0);
}