Pagini recente » Cod sursa (job #1556018) | Cod sursa (job #642448) | Cod sursa (job #8020) | Cod sursa (job #631008) | Cod sursa (job #2113772)
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int n,L,i,j,k,T,A[110],B[110],D[110][110],p,u,b;
struct solutie{
int tipa,tipb;
}sol[110];
int main(){
fin>>n>>L;
for(i=1;i<=n;i++)
fin>>A[i]>>B[i];
p=1;u=101;
while(p<=u){
T=(p+u)/2;
for(i=0;i<=109;i++)
for(j=0;j<=109;j++)
D[i][j]=-100000000;
D[0][0]=0;
for(i=1;i<=n;i++)
for(j=0;j<=L;j++)
for(k=0;k<=T/A[i] && k<=j;k++){
b=(T-k*A[i])/B[i];
D[i][j]=max(D[i][j],D[i-1][j-k]+b);
}
if(D[n][L]>=L)
u=T-1;
else
p=T+1;
}
for(i=0;i<=109;i++)
for(j=0;j<=109;j++)
D[i][j]=-10000000;
D[0][0]=0;
for(i=1;i<=n;i++)
for(j=0;j<=L;j++)
for(k=0;k<=p/A[i] && k<=j;k++){
b=(p-k*A[i])/B[i];
D[i][j]=max(D[i][j],D[i-1][j-k]+b);
}
for(i=n;i>=1;i--)
for(k=0;k<=p/A[i];k++){
b=(p-A[i]*k)/B[i];
if(D[i][L]==D[i-1][L-k]+b){
sol[i].tipa=k;
sol[i].tipb=b;
L-=k;
break;
}
}
fout<<p<<"\n";
for(i=1;i<=n;i++)
fout<<sol[i].tipa<<" "<<sol[i].tipb<<"\n";
}