Pagini recente » Cod sursa (job #1897688) | Cod sursa (job #2295775) | Cod sursa (job #2472624) | Cod sursa (job #2978563) | Cod sursa (job #1056886)
#include<cstdio>
#include<algorithm>
using namespace std;
const int LIM = 101;
struct copil{
int a,b;
}cp[LIM];
int n,l;
int dr[110][2010]; copil urma[110][2010];
const int LIMX = 2000;
bool canDrink(int t){
for(int i=0; i<=n; i++){
dr[i][0]=0;
for(int j=1; j<=LIMX; j++)
dr[i][j]=-1;
}
for(int i=1; i<=n; i++){
for(int j=l; j>=0; j--){
if(dr[i-1][j]!=-1){
for(int b=0; b*cp[i].b<=t; b++){
int ramas = t - b*cp[i].b;
int a = ramas / cp[i].a;
if(dr[i][j+b]<a+dr[i-1][j]){
urma[i][j+b].a = a;
urma[i][j+b].b = b;
dr[i][j+b] = a+dr[i-1][j];
}
}
}
}
}
for(int i=l; i<=LIMX; i++){
if(dr[n][i]!=-1){
if(dr[n][i]>=l)
return true;
else return false;
}
}
return false;
}
int main(){
FILE *in=fopen("lapte.in","r"), *out=fopen("lapte.out","w");
fscanf(in, "%d%d", &n, &l);
for(int i=1; i<=n; i++){
fscanf(in, "%d%d", &cp[i].a, &cp[i].b);
}
int l1=1, l2=100, l3, sol=100;
while(l1<l2){
l3=l1+(l2-l1)/2;
if(canDrink(l3)){
sol=l3;
l2=l3-1;
}else{
l1=l3+1;
}
}
canDrink(sol);
fprintf(out, "%d\n", sol);
int baut = -1;
for(int i=l; i<=LIMX && baut==-1; i++){
if(dr[n][i]!=-1 && dr[n][i]>=l){
baut = i;
}
}
int curent = n;
while(curent > 0){
cp[curent].a = urma[curent][baut].a;
cp[curent].b = urma[curent][baut].b;
baut -= urma[curent][baut].b;
curent--;
}
for(int i=1; i<=n; i++){
fprintf(out, "%d %d\n", cp[i].a, cp[i].b);
}
for(int i=1; i<=n; i++){
for(int j=0; j<=l; j++)
fprintf(out, "%d ", dr[i][j]);
fprintf(out, "\n");
}
return 0;
}