Pagini recente » Cod sursa (job #2077428) | Cod sursa (job #951846) | Cod sursa (job #987956) | Cod sursa (job #1119969) | Cod sursa (job #1696164)
#include <fstream>
#include <cstring>
using namespace std;
const int MaxN = 105;
ifstream cin ("lapte.in");
ofstream cout ("lapte.out");
int dp[MaxN][MaxN], QuantitTo[MaxN][MaxN], A[MaxN], B[MaxN], QuantitA[MaxN];
int n, L, Ans, MilkLeft;
bool Ok(int T) {
memset(dp, -1, sizeof dp);
memset(QuantitTo, 0, sizeof QuantitTo);
dp[0][0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= L; ++j) {
for (int k = 0; k <= j and k * A[i] <= T; ++k) {
if (dp[i - 1][j - k] != -1) {
int new_B = dp[i - 1][j - k] + (T - k * A[i]) / B[i];
if (new_B > dp[i][j]) {
dp[i][j] = new_B;
QuantitTo[i][j] = k;
}
}
}
}
}
return dp[n][L] >= L;
}
inline int BinSearch(int l, int r) {
int med, ans = -1;
while (l <= r) {
med = (l + r) / 2;
if (Ok(med)) {
r = med - 1;
ans = med;
}
else {
l = med + 1;
}
}
return ans;
}
int main() {
cin >> n >> L;
for (int i = 1; i <= n; ++i) {
cin >> A[i] >> B[i];
}
Ans = BinSearch(1, 101);
cout << Ans << '\n';
Ok(Ans);
MilkLeft = L;
for (int i = n; i >= 1; --i) {
QuantitA[i] = QuantitTo[i][MilkLeft];
MilkLeft -= QuantitA[i];
}
for(int i = 1; i <= n; ++i) {
int QuantitB = (Ans - QuantitA[i] * A[i]) / B[i];
cout << QuantitA[i] << ' ' << QuantitB << '\n';
}
return 0;
}