Pagini recente » Cod sursa (job #897917) | Cod sursa (job #2111456) | Cod sursa (job #976072) | Cod sursa (job #768239) | Cod sursa (job #2204384)
#include <cstdio>
#include <algorithm>
using namespace std;
struct Petrecareti {
int ta, tb;
};
struct Solutie {
int a, b;
};
int n, l;
const int NMAX = 105;
Petrecareti v[NMAX];
int sepoate[NMAX][NMAX];
int bmax[NMAX][NMAX];
Solutie sol[NMAX];
bool vf(int t) {
for(int i = 0; i <= n; ++i) {
for(int j = 0; j <= l; ++j) {
sepoate[i][j] = -1e9;
}
}
for(int i = 1; i <= n; ++i) {
for(int j = 0; j <= l; ++j) {
bmax[i][j] = (t - j * v[i].ta) / v[i].tb;
}
}
sepoate[0][0] = 0;
for(int i = 1; i <= n; ++i) {
for(int j = 0; j <= l; ++j) {
for(int k = 0; k <= j && t - k * v[i].ta >= 0; ++k) {
sepoate[i][j] = max(sepoate[i][j], sepoate[i - 1][j - k] + bmax[i][k]);
}
}
}
return sepoate[n][l] >= l;
}
int cb(int st, int dr) {
int last = 0;
while(st <= dr) {
int mij = (st + dr) / 2;
if(vf(mij) == 1) {
dr = mij - 1;
last = mij;
}
else {
st = mij + 1;
}
}
return last;
}
int main() {
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
scanf("%d%d", &n, &l);
for(int i = 1; i <= n; ++i) {
scanf("%d%d", &v[i].ta, &v[i].tb);
}
int timp = cb(1, 100);
printf("%d\n", timp);
vf(timp);
int a = l;
for(int i = n; i > 0; --i) {
bool ok = 0;
for(int j = 0; ok == 0 && j <= a && timp - j * v[i].ta >= 0; ++j) {
if(sepoate[i - 1][a - j] + bmax[i][j] == sepoate[i][a]) {
sol[i].a = j;
sol[i].b = bmax[i][j];
a -= j;
ok = 1;
}
}
}
for(int i = 1; i <= n; ++i) {
printf("%d %d\n", sol[i].a, sol[i].b);
}
return 0;
}