Pagini recente » Cod sursa (job #2031590) | Cod sursa (job #2037213) | Cod sursa (job #1671112) | Cod sursa (job #1023550) | Cod sursa (job #1023544)
#include <fstream>
#include <cstring>
using namespace std;
const int MAX_N = 101;
int N, L;
int a[MAX_N], b[MAX_N], ans[MAX_N][2];
pair < int, int > Prev[MAX_N][MAX_N][MAX_N];
bool D[MAX_N][MAX_N][MAX_N];
bool check(int T) {
memset(D, 0, sizeof(D));
D[0][0][0] = 1;
for(int k = 1; k <= N; ++k)
for(int i = 0; i <= L; ++i)
for(int j = 0; j <= L; ++j) {
for(int x = 0; x * a[k] <= T && x <= i; ++x) {
int y = min(j, (T - x * a[k]) / b[k]);
if(D[k - 1][i - x][j - y])
D[k][i][j] = 1, x = i;
}
}
return D[N][L][L];
}
void buildSolution(int T) {
memset(D, 0, sizeof(D));
D[0][0][0] = 1;
for(int k = 1; k <= N; ++k)
for(int i = 0; i <= L; ++i)
for(int j = 0; j <= L; ++j) {
for(int x = 0; x * a[k] <= T && x <= i; ++x) {
int y = min(j, (T - x * a[k]) / b[k]);
if(D[k - 1][i - x][j - y]) {
Prev[k][i][j] = make_pair(i - x, j - y);
D[k][i][j] = 1, x = i;
}
}
}
int x = L, y = L;
for(int k = N; k; --k) {
int x1 = Prev[k][x][y].first, y1 = Prev[k][x][y].second;
ans[k][0] = x - x1, ans[k][1] = y - y1;
x = x1, y = y1;
}
}
int main() {
ifstream f("lapte.in");
ofstream g("lapte.out");
f >> N >> L;
for(int i = 1; i <= N; ++i)
f >> a[i] >> b[i];
int minT = 20000;
for(int l = 0, r = 20000, m; l <= r; ) {
m = (l + r) / 2;
if(check(m))
minT = m, r = m - 1;
else l = m + 1;
}
buildSolution(minT);
g << minT << "\n";
for(int i = 1; i <= N; ++i)
g << ans[i][0] << " " << ans[i][1] << "\n";
f.close();
g.close();
return 0;
}