Pagini recente » Cod sursa (job #2098809) | Cod sursa (job #2372148) | Cod sursa (job #1793517) | Cod sursa (job #848255) | Cod sursa (job #1435757)
#include <fstream>
#define nmax 105
using namespace std;
ifstream f("lapte.in"); ofstream g("lapte.out");
int n,L,dp[nmax][nmax],a[nmax],b[nmax],drum[nmax][nmax];
struct {int x,y;} rez[nmax];
bool verif(int T)
{ int i,j,k;
for(i=0;i<=n;i++) for(j=1;j<=L;j++) dp[i][j]=-1, drum[i][j]=0;
for(i=0;i<=n;i++) dp[i][0]=0, drum[i][0]=0;
for(i=1;i<=n;i++)
{ for(j=0;j<=L;j++)
{ for(k=0;k<=T/a[i]&&k<=j;k++)
{ if(dp[i-1][j-k]<0) continue;
int cost_a=k*a[i];
int litri_b=(T-cost_a)/b[i];
if(dp[i][j]<dp[i-1][j-k]+litri_b)
{ dp[i][j]=dp[i-1][j-k]+litri_b;
drum[i][j]=k;
}
}
}
}
if(dp[n][L]>=L)
{ int nr=L;
for(i=n;i>=1;i--)
{ rez[i].x=drum[i][nr];
rez[i].y=(T-rez[i].x*a[i])/b[i];
nr-=rez[i].x;
}
return 1;
}
return 0;
}
int rezolva()
{ int st=0,dr=105,sol=0;
while(st<=dr)
{ int mij=(st+dr)/2;
if(verif(mij)) {sol=mij; dr=mij-1;} else st=mij+1;
}
return sol;
}
int main()
{ f>>n>>L;
for(int i=1;i<=n;i++) f>>a[i]>>b[i];
g<<rezolva()<<"\n";
for(int i=1;i<=n;i++) g<<rez[i].x<<" "<<rez[i].y<<"\n";
g.close(); return 0;
}