Pagini recente » Cod sursa (job #2491917) | Cod sursa (job #1713054) | Cod sursa (job #1852853) | Cod sursa (job #3030467) | Cod sursa (job #2811436)
#include <fstream>
#define DIM 102
using namespace std;
int D[DIM][DIM];
int T[DIM][DIM];
int a[DIM], b[DIM];
int n, L, st, dr, mid;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
int ok(int t) {
/**
D[i][j] = numarul maxim de litri de tip b care pot fi bauti asa
incat sa se poata bea exact j litri de tip a de primele i persoane
**/
int ret = 0;
for (int i=1;i<=n;i++)
for (int j=0;j<=L;j++)
D[i][j] = -1;
for (int j=0;j<=min(L, t/a[1]);j++) {
D[1][j] = (t-a[1]*j)/b[1];
T[1][j] = j;
}
for (int i=2;i<=n;i++) {
for (int j=0;j<=min(L, t/a[i]);j++) {
/// persoana i bea j litri de lapte de tip a
for (int k=0;k<=L-j;k++)
if (D[i-1][k] != -1) {
if (D[i][k+j] < D[i-1][k] + ( (t-a[i]*j)/b[i] )) {
D[i][k+j] = D[i-1][k] + ( (t-a[i]*j)/b[i] );
T[i][k+j] = j;
if (k+j == L && D[i][k+j] >= L) {
ret = 1;
}
}
}
}
}
return ret;
}
void drum(int n, int L) {
if (n) {
drum(n-1, L-T[n][L]);
fout<<T[n][L]<<" "<<(st-a[n]*T[n][L])/b[n]<<"\n";
}
}
int main (){
fin>>n>>L;
for (int i=1;i<=n;i++) {
fin>>a[i]>>b[i];
}
st = 1; dr = L*(a[1] + b[1]);
while (st <= dr) {
int mid =(st+dr)/2;
if (ok(mid))
dr = mid-1;
else
st = mid+1;
}
ok(st);
fout<<st<<"\n";
drum(n, L);
return 0;
}