Pagini recente » Cod sursa (job #677839) | Cod sursa (job #1426530) | Cod sursa (job #2296033) | Cod sursa (job #1834327) | Cod sursa (job #2112493)
#include <cstdio>
#include <algorithm>
#define INF 2000000000
using namespace std;
pair <int,int> rec[101][101],sol[101];
int d[101][101],n,l,a[101],b[101];
int verif (int t){
int i,j,jj,lb;
// d[i][j] = nr de l de lapte B bauti daca nr 1..i-1 beau j l de lapte A
for (i=0;i<=100;i++)
for (j=0;j<=100;j++)
d[i][j]=-INF;
d[0][0]=0;
for (i=1;i<=n;i++){
for (j=0;j<=t/a[i];j++){ // i bea fix j litri de lapte A
for (jj=0;jj+j<=l;jj++){
lb=(t-j*a[i])/b[i];
if (lb+d[i-1][jj]>d[i][j+jj]){
d[i][j+jj]=lb+d[i-1][jj];
rec[i][j+jj]=make_pair(j,lb);
}
}
}
}
if (d[n][l]>=l)
return 1;
return 0;
}
int main()
{
FILE *fin=fopen ("lapte.in","r");
FILE *fout=fopen ("lapte.out","w");
int i,st,dr,mid,j;
fscanf (fin,"%d%d",&n,&l);
for (i=1;i<=n;i++)
fscanf (fin,"%d%d",&a[i],&b[i]);
st=1;
dr=100;
while (st<=dr){
mid=(st+dr)/2;
if (verif (mid))
dr=mid-1;
else st=mid+1;
}
fprintf (fout,"%d\n",st);
verif (st);
j=l;
for (i=n;i>0;i--){
sol[i]=rec[i][j];
j=j-rec[i][j].first;
}
for (i=1;i<=n;i++)
fprintf (fout,"%d %d\n",sol[i].first,sol[i].second);
return 0;
}