Pagini recente » Cod sursa (job #1148204) | Cod sursa (job #288672) | Cod sursa (job #41436) | Cod sursa (job #1957980) | Cod sursa (job #1056562)
#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;
}
};
struct rec {
int i,j,k;
rec() {
i=j=k;
}
rec(int _i,int _j, int _k) {
i=_i;
j=_j;
k=_k;
}
};
const int MAX_N=110;
bool d[MAX_N][MAX_N][MAX_N];
rec dad[MAX_N][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) {
for(int k=0;k<=L;++k) {
d[i][j][k]=false;
}
}
}
d[0][0][0]=true;
}
bool dinamic(int t) {
init();
for(int i=1;i<=N;++i) {
for(int j=0;j<=L;++j) {
for(int k=0;k<=L;++k) {
if(d[i-1][j][k]) {
for(int p=0;p<=t/v[i].a;p++) {
d[i] [min(j+p,L)] [ min(k + (t - p*v[i].a) / v[i].b, L)]=true;
}
}
}
}
}
return d[N][L][L];
}
void solve(int t) {
init();
for(int i=1;i<=N;++i) {
for(int j=0;j<=L;++j) {
for(int k=0;k<=L;++k) {
if(d[i-1][j][k]) {
for(int p=0;p<=t/v[i].a;p++) {
d[i] [min(j+p,L)] [ min(k + (t - p*v[i].a) / v[i].b, L)]=true;
dad[i] [min(j+p,L)] [ min(k + (t - p*v[i].a) / v[i].b, L)]=rec(i-1,j,k);
}
}
}
}
}
}
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);
solve(a);
rec act=rec(N,L,L);
while(act.i!=0) {
rec aux=act;
act=dad[aux.i][aux.j][aux.k];
beut[aux.i]=be(aux.j-act.j,aux.k-act.k);
}
for(int i=1;i<=N;++i) {
printf("%d %d\n",beut[i].a,beut[i].b);
}
return 0;
}