Pagini recente » Cod sursa (job #1190456) | Cod sursa (job #2532839) | Cod sursa (job #899461) | Cod sursa (job #977688) | Cod sursa (job #1023550)
#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], D[MAX_N][MAX_N], Prev[MAX_N][MAX_N];
bool check(int T) {
memset(D, 0, sizeof(D));
for(int i = 0; i * a[1] <= T; ++i)
D[1][i] = (T - i * a[1]) / b[1];
for(int k = 2; k <= N; ++k)
for(int i = 0; i <= L; ++i)
for(int x = 0; x * a[k] <= T && x <= i; ++x) {
int y = (T - x * a[k]) / b[k];
D[k][i] = max(D[k][i], D[k - 1][i - x] + y);
}
if(D[N][L] >= L)
return 1;
return 0;
}
void buildSolution(int T) {
memset(D, 0, sizeof(D));
for(int i = 0; i * a[1] <= T; ++i)
D[1][i] = (T - i * a[1]) / b[1];
for(int k = 2; k <= N; ++k)
for(int i = 0; i <= L; ++i)
for(int x = 0; x * a[k] <= T && x <= i; ++x) {
int y = (T - x * a[k]) / b[k];
if(D[k - 1][i - x] + y > D[k][i]) {
D[k][i] = D[k - 1][i - x] + y;
Prev[k][i] = i - x;
}
}
int x = L;
for(int k = N; k; --k) {
int x1 = Prev[k][x];
ans[k][0] = x - x1, ans[k][1] = (T - (x - x1) * a[k]) / b[k];
x = x1;
}
}
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;
}