Pagini recente » Cod sursa (job #1098007) | Cod sursa (job #2376277) | Cod sursa (job #1848681) | Cod sursa (job #543266) | Cod sursa (job #856181)
Cod sursa(job #856181)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define NMax 110
using namespace std;
const char IN[]="lapte.in",OUT[]="lapte.out";
struct copil{
int x,y;
} v[NMax], r[NMax];
int N,L,Rez,Rx,Ry;
int D[NMax][NMax], P[NMax][NMax];
bool test(int T)
{
int i,j,k,A=0,x,y,ret=0;
for (i=1;i<=N;++i)
A+=T/v[i].x;
A-=L;
if (A<=0) return false;
memset(D,0,sizeof(D));
memset(P,0,sizeof(P));
for (i=1;i<=N;++i)
for (j=0;j<=A;++j)
{
D[i][j]=D[i-1][j];P[i][j]=0;
for (k=0;k<=T/v[i].y;++k){
y=k;
x=T/v[i].x-(T-y*v[i].y)/v[i].x;
if (x+j<=A && D[i][j]<D[i-1][j+x]+y)
D[i][j]=D[i-1][j+x]+y;
P[i][j]=x;
}
if (D[i][j]>=ret){
ret=D[i][j];
Rx=i;Ry=j;
if (ret>=L) return true;
}
}
return ret>=L;
}
int search(int L)
{
int i,step;
for (step=1;step<=L;step<<=1);
for (i=L;step;step>>=1)
if (i-step>0 && test(i-step))
i-=step;
return i;
}
int main()
{
int i;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&L);
for (i=1;i<=N;++i) scanf("%d%d",&v[i].x,&v[i].y);
fclose(stdin);
Rez=search(100);
test(Rez);
for (i=N;i>Rx;--i) r[i].x=Rez/v[i].x,r[i].y=0;
for (;Rx>0;--Rx)
{
r[Rx].y=D[Rx][Ry]-D[Rx-1][P[Rx][Ry+P[Rx][Ry]]];//(Rez-r[Rx].x*v[Rx].x)/v[Rx].y;
r[Rx].x=(Rez-r[Rx].y*v[Rx].y)/v[Rx].x;
Ry+=P[Rx][Ry];
}
freopen(OUT,"w",stdout);
printf("%d\n",Rez);
for (i=1;i<=N;++i) printf("%d %d\n",r[i].x,r[i].y);
fclose(stdout);
return 0;
}