Pagini recente » Cod sursa (job #2863371) | Cod sursa (job #141521) | Cod sursa (job #2528846) | Cod sursa (job #1096744) | Cod sursa (job #1065592)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct be {
int a,b;
be() {
a=b=0;
}
be(int _a,int _b) {
a=_a;
b=_b;
}
};
const int MAX_N=110;
int d[MAX_N][MAX_N];
int dad[MAX_N][MAX_N];
int N,L;
be v[MAX_N];
void init() {
for(int i=0;i<=N;++i) {
for(int j=0;j<=L;++j) {
d[i][j]=-1;
dad[i][j]=0;
}
}
d[0][0]=0;
}
bool dinamic(int t) {
init();
for(int i=1;i<=N;++i) {
for(int j=0;j<=L;++j) {
if(d[i-1][j]!=-1) {
for(int p=0;p<=t/v[i].a && j+p<=L;p++) {
if( d[i-1][j]+ (t - p*v[i].a) / v[i].b > d[i][j+p] ) {
d[i][j+p] = d[i-1][j]+ (t - p*v[i].a) / v[i].b ;
dad[i][j+p]=p;
}
}
}
}
}
return d[N][L]>=L;
}
int b_search(int st,int dr) {
int ans=100;
while(st<=dr) {
int mij=(st+dr)/2;
if(dinamic(mij)) {
ans=mij;
dr=mij-1;
}
else {
st=mij+1;
}
}
return ans;
}
be beut[MAX_N];
int main() {
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&N,&L);
for(int i=1;i<=N;++i) {
int a,b;
scanf("%d%d",&a,&b);
v[i]=be(a,b);
}
int a=b_search(1,100);
printf("%d\n",a);
dinamic(a);
for(int i=N,l=L;i>=1;i--) {
beut[i].a=dad[i][l];
beut[i].b=(a-beut[i].a*v[i].a)/v[i].b;
l-=dad[i][l];
}
for(int i=1;i<=N;++i) {
printf("%d %d\n",beut[i].a,beut[i].b);
}
return 0;
}