Pagini recente » Cod sursa (job #468076) | Cod sursa (job #1395725) | Cod sursa (job #1384795) | Cod sursa (job #801729) | Cod sursa (job #2065820)
#include <fstream>
#define DIM 102
#define INF 1000000000
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int n,l,i,j,st,dr,mid;
int d[DIM][DIM],sol[DIM][DIM],a[DIM],b[DIM];
int solve (int t){
for (int i=0;i<=DIM;i++)
for (int j=0;j<=DIM;j++)
d[i][j] = -INF;
d[0][0] = 0;
for (int i=1;i<=n;i++)
for (int C=0;C<=t/a[i];C++)
for (int j=0;j<=l-C;j++){
int lb = (t - C*a[i]) / b[i];
if (d[i][j+C] < d[i-1][j] + lb){
d[i][j+C] = d[i-1][j] + lb;
sol[i][j+C] = C;
}
}
if (d[n][l] >= l)
return 1;
return 0;
}
void afisare (int n,int l){
if (n != 0){
afisare (n-1,l-sol[n][l]);
fout<<sol[n][l]<<" "<<d[n][l] - d[n-1][l-sol[n][j]]<<"\n";
}
}
int main (){
fin>>n>>l;
for (i=1;i<=n;i++)
fin>>a[i]>>b[i];
/// d[i][j] - cantitatea maxima de lapte b care se poate bea daca primii i au baut j litri de lapte a
st = 1;
dr = 100;
while (st<=dr){
int mid = (st + dr)/2;
if (solve(mid))
dr = mid-1;
else
st = mid+1;
}
fout<<st<<"\n";
solve (st);
/*l -= sol[n][l];
n--;
while (n != 0){
fout<<sol[n][l]<<" "<<d[n][l] - d[n-1][l-sol[n][j]]<<"\n";
l -= sol[n][l];
n--;
}
*/
afisare (n,l);
return 0;
}