Pagini recente » Cod sursa (job #94767) | Cod sursa (job #1685508) | Cod sursa (job #615438) | Cod sursa (job #710187) | Cod sursa (job #2308849)
#include <fstream>
#include <cstring>
#define N_MAX 105
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
struct Milk {
int a, b;
} a[N_MAX];
int N, L;
int dp[N_MAX][N_MAX], sol;
int lapte_bautA[N_MAX][N_MAX];
int litriB_ramasi(int t, int i, int litriA) {
return (t - a[i].a * litriA) / a[i].b;
}
bool check(int t_max) {
memset(dp, -0x3f, sizeof(dp));
dp[0][0] = 0;
for (int i = 1; i <= N; ++i)
for (int litriA = 0; litriA <= L && a[i].a * litriA <= t_max; ++litriA)
for (int litri_totali = litriA; litri_totali <= L; ++litri_totali) {
int litriB = litriB_ramasi(t_max, i, litriA) + dp[i - 1][litri_totali - litriA];
if (litriB > dp[i][litri_totali]) {
dp[i][litri_totali] = litriB;
lapte_bautA[i][litri_totali] = litriA;
}
}
return dp[N][L] >= L;
}
void print(int i, int litriA) {
if (!i)
return;
print(i - 1, litriA - lapte_bautA[i][litriA]);
out << lapte_bautA[i][litriA] << ' ' << litriB_ramasi(sol, i, lapte_bautA[i][litriA]) << '\n';
}
int main() {
in >> N >> L;
for (int i = 1; i <= N; ++i)
in >> a[i].a >> a[i].b;
for (int stg = 1, drp = 100; stg <= drp;) {
int mij = (stg + drp) / 2;
if (check(mij)) {
sol = mij;
drp = mij - 1;
} else {
stg = mij + 1;
}
}
check(sol);
out << sol << '\n';
print(N, L);
}