Pagini recente » Cod sursa (job #1958587) | Cod sursa (job #891688) | Cod sursa (job #537688) | Cod sursa (job #2988282) | Cod sursa (job #2367505)
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int n, L, i, st, dr, mid;
int a[105], b[105];
int d[105][105], t[105][105];
//d[i][j] = cantitatea maxima de lapte de tip B daca primii i consuma fix j litri de tip A
//t[i][j] = cantitatea de tip B pe care o bea persoana i daca consuma j litri de tip A
inline bool check (int p){
int i, j, k;
bool ok = false;
for (i=1; i<=n; i++){
for (j=0; j<=L; j++){
d[i][j] = -1;
}
}
for (j=0; j<=min (L, p/a[1]); j++){
d[1][j] = (p-a[1]*j)/b[1];
t[1][j] = j;
}
for (i=2; i<=n; i++){
for (j=0; j<=min (L, p/a[i]); j++){
for (k=0; k<=L-j; k++){
if (d[i-1][k] != -1){
if (d[i][k+j] < d[i-1][k] + (p-a[i]*j)/b[i]){
d[i][k+j] = d[i-1][k] + (p-a[i]*j)/b[i];
t[i][k+j] = j;
if (k + j == L && d[i][k+j] >= L){
ok = true;
}
}
}
}
}
}
return ok;
}
inline void path (int n, int L){
if (n > 0){
path (n-1, L - t[n-1][L]);
fout << t[n][L] << " " << (st - t[n][L]*a[n])/b[n] << "\n";
}
}
int main(){
fin >> n >> L;
for (i=1; i<=n; i++){
fin >> a[i] >> b[i];
}
st = 1, dr = L*(a[1] + b[1]);
while (st <= dr){
mid = st + (dr - st)/2;
if (check (mid)){
dr = mid - 1;
}
else{
st = mid + 1;
}
}
fout << st << "\n";
check (st);
/*for (i=1; i<=n; i++){
for (int j=0; j<=st; j++){
fout << t[i][j] << " ";
}
fout << "\n";
}*/
path (n, L);
return 0;
}