Pagini recente » Cod sursa (job #1908214) | Cod sursa (job #1819490) | Cod sursa (job #1969760) | Cod sursa (job #440498) | Cod sursa (job #808581)
Cod sursa(job #808581)
#include<stdio.h>
#include<string.h>
#define NMAX 107
int n,p,l,sol;
int rec[NMAX][NMAX],d[NMAX][NMAX];//d=dinamica
int a[NMAX],b[NMAX];
int dinamic(int x)
{
int i, j, k;
memset(d,-1,sizeof(d));
memset(rec,0,sizeof(rec));
d[0][0] = 0;
//dinamica
for(i=1;i<=n;++i)
for(j=0;j<=l;++j)
for(k=0;k<=j;++k)
if(d[i-1][k]!=-1&&(j-k)*a[i]<=x)
{
int val;
val=d[i-1][k]+(x-(j-k)*a[i])/b[i];
if(val>d[i][j])
{
d[i][j]=val;
rec[i][j]=k;//reconstituire
}
}
if(d[n][l]>=l)
return 1;
return 0;
}
void cb(int st,int dr)
{
int med;
while(st<=dr)
{
med=(st+dr)/2;
if(dinamic(med))
{
sol=med;
dr=med-1;
}
else
st=med+1;
}
}
int main()
{
int i;
freopen ("lapte.in", "r", stdin);
freopen ("lapte.out", "w", stdout);
scanf("%d %d", &n,&l);
for(i=1;i<=n;++i)
scanf("%d %d",&a[i],&b[i]);
cb(1,101);
printf("%d\n",sol);
dinamic(sol);
p=l;
for(i=n;i>=1;--i)
{
a[i]=p-rec[i][p];
b[i]=d[i][p]-d[i-1][rec[i][p]];
p=rec[i][p];
}
for(i=1;i<=n;++i)
printf("%d %d\n",a[i],b[i]);
return 0;
}