Pagini recente » Cod sursa (job #1715576) | Cod sursa (job #2222286) | Cod sursa (job #1491315) | Cod sursa (job #306967) | Cod sursa (job #1117672)
#include <cstdio>
#define Nmax 105
#define INF 2000000000
using namespace std;
int N,L,dp[Nmax][Nmax];
struct om
{
int a,b;
};
om v[Nmax],r[Nmax][Nmax],t[Nmax][Nmax],s[Nmax];
inline bool Ok(int T)
{
int i,j,k;
for(i=0;i<=N;++i)
for(j=0;j<=L;++j)
dp[i][j]=-INF;
dp[0][0]=0;
for(i=1;i<=N;++i)
for(j=0;j<=L;++j)
for(k=0;k<=j;++k)
if(k*v[i].a<=T && dp[i-1][j-k]>=0 && dp[i][j]<dp[i-1][j-k]+(T-k*v[i].a)/v[i].b)
{
dp[i][j]=dp[i-1][j-k]+(T-k*v[i].a)/v[i].b;
t[i][j].a=k;
t[i][j].b=(T-k*v[i].a)/v[i].b;
}
if(dp[N][L]>=L)
return true;
return false;
}
int main()
{
freopen ("lapte.in","r",stdin);
freopen ("lapte.out","w",stdout);
int i,j,st=1,dr=1000000,mij,sol;
scanf("%d%d", &N,&L);
for(i=1;i<=N;++i)
scanf("%d%d", &v[i].a,&v[i].b);
while(st<=dr)
{
mij=(st+dr)/2;
if(Ok(mij))
{
sol=mij;
for(i=1;i<=N;++i)
for(j=0;j<=L;++j)
{
r[i][j].a=t[i][j].a;
r[i][j].b=t[i][j].b;
}
dr=mij-1;
}
else
st=mij+1;
}
printf("%d\n", sol);
i=N; j=L;
while(i && j>=0)
{
s[i].a=r[i][j].a; s[i].b=r[i][j].b;
j-=s[i].a; --i;
}
for(i=1;i<=N;++i)
printf("%d %d\n", s[i].a, s[i].b);
return 0;
}