Pagini recente » Cod sursa (job #699764) | Cod sursa (job #1399040) | Cod sursa (job #1932352) | Cod sursa (job #1956951) | Cod sursa (job #2710433)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
const int NMAX = 128;
class person {
public:
int a, b;
} v[NMAX], sol[NMAX][NMAX];
int N, L, dp[NMAX][NMAX];
bool check(const int &x) {
for(int i = 0; i <= N; ++i)
for(int j = 0; j <= L; ++j)
dp[i][j] = -INF;
dp[0][0] = 0;
for(int i = 1; i <= N; ++i)
for(int j = 0; j <= L; ++j)
for(int k = 0; k <= j && v[i].a * k <= x; ++k) {
int rem_time = x - (v[i].a * k);
int add = rem_time / v[i].b;
if(dp[i][j] < dp[i - 1][j - k] + add) {
dp[i][j] = dp[i - 1][j - k] + add;
sol[i][j] = person{k, add};
}
}
return dp[N][L] >= L;
}
void solve(const int &A, const int &B) {
if(A == 1) {
fout << sol[A][B].a << ' ' << sol[A][B].b << '\n';
return;
}
solve(A - 1, B - sol[A][B].a);
fout << sol[A][B].a << ' ' << sol[A][B].b << '\n';
}
int main() {
fin >> N >> L;
for(int i = 1; i <= N; ++i)
fin >> v[i].a >> v[i].b;
int st = 1, dr = 1e4, ans = 1e4 + 1;
while(st <= dr) {
int mid = (st + dr) >> 1;
if(check(mid)) {
ans = mid;
dr = mid - 1;
}
else
st = mid + 1;
}
fout << ans << '\n';
solve(N, L);
}