Pagini recente » Cod sursa (job #2793271) | Cod sursa (job #2965974) | Cod sursa (job #3252760) | Cod sursa (job #1255987) | Cod sursa (job #763765)
Cod sursa(job #763765)
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
#define MAXN 200
#define upbound 500
int n, l, pd[MAXN][MAXN], a[MAXN], b[MAXN], reconst[MAXN][MAXN];
int doDinamica(int x) {
int i, j, k;
for (i = 0; i <= l; ++i)
pd[0][i] = -1;
for (i = 1; i <= l; ++i)
memset(pd[i], 0, sizeof(pd[i]));
pd[0][0] = 0;
//if (x == 18)
// cerr << "OK\n";
for (i = 1; i <= n; ++i)
for (j = 0; j <= l; ++j) {
pd[i][j] = -1;
for (k = 0; k <= j; ++k) {
if (pd[i - 1][k] != -1 && pd[i][j] < pd[i - 1][k] + ((x - (j - k) * a[i]) / b[i]) && (x - (j - k) * a[i]) >= 0) {
pd[i][j] = pd[i - 1][k] + ((x - (j - k) * a[i]) / b[i]);
reconst[i][j] = j - k;
}
//if (x == 18 && i == 2){
// cerr << "j: " << j << " k: " << k << " b: " << pd[i][j] << " pd: ";
// cerr << pd[i - 1][k] << " wild: " << (x - (j - k) * a[i]) << "\n";;
//}
}
}
if (pd[n][l] >= l)
return 1;
return 0;
}
int cautareBinara() {
int st = 1, fn = upbound, m;
while(st < fn) {
m = (st + fn) / 2;
//cerr << "m: " << m << " rez: " << doDinamica(m) << "\n";
if (doDinamica(m))
fn = m;
else
st = m + 1;
}
return st;
}
void raspunde(int n, int l, int rez) {
int x, y;
x = reconst[n][l];
y = (rez - x * a[n]) / b[n];
if (n != 1)
raspunde (n - 1, l - x, rez);
fout << x << " " << y << "\n";
}
int main() {
int i, rez;
fin >> n >> l;
for (i = 1; i <= n; ++i)
fin >> a[i] >> b[i];
rez = cautareBinara();
fout << rez << "\n";
raspunde(n, l, rez);
return 0;
}