有紅藍兩種糖果,紅色糖果每顆重wr克,甜度為hr;藍色糖果每顆重wb克,甜度為hb;有容量為C克的盒子,求能裝下的最大甜度。
1<=C,hr,hb,wr,wb<=1E9
分析:記S=lcm(wr,wb)
,那麼對於S克容量,可以裝S/wr
顆藍色糖果,也可以裝S/wb
顆紅色糖果,甜度分別為S*hb/wr
和S*hr/wb
,應該選甜度更大的。因此在列舉時,紅色糖果數只需要列舉[0,wb),藍色糖果數只需要列舉[0,wr),應該選擇範圍更小的進行列舉。另外列舉範圍也不會超過C/max(wr,wb),最壞情況是wr和wb取sqrt(C)。
#include <bits/stdc++.h>
using i64 = long long;
void solve() {
i64 C, hr, hb, wr, wb;
std::cin >> C >> hr >> hb >> wr >> wb;
i64 ans = 0;
for (i64 i = 0; i * i <= C; i++) {
if (i * wr <= C) {
ans = std::max(ans, i * hr + (C - i * wr) / wb * hb);
}
if (i * wb <= C) {
ans = std::max(ans, i * hb + (C - i * wb) / wr * hr);
}
}
std::cout << ans << "\n";
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int t = 1;
while (t--) solve();
return 0;
}