UVA-12325 Zombie's Treasure Chest 思维,枚举
题意
现有一个体积为(N)的箱子和两种数量无限的宝物。宝物1的体积为(S1) ,价值为(V1) ,宝物2的体积为(S2) ,价值为(V2) 。
保证输入均为32位带符号整数。
给出能够装纳的最大价值。
分析
直接背包,复杂度肯定不对。
特殊性质在于只有两个物品,考虑贪心的选择。
若$N / S1 $ 比较小,在枚举范围内,那么直接枚举宝物1的数量。
若(N/S2) 比较小,在枚举范围内,那么直接枚举宝物2的数量。
若(N / S1 and N / S2) 都比较大,说明(S1,S2) 比较小。
由于(S1 imes S2 = S2 imes S1)。
这说明我们会贪心的选择性价比较高的。这表明还是可以把枚举量控制在S内。
代码
vconst ll N = 1e5;
int main() {
int T = readint();
int kase = 1;
while (T--) {
ll res = 0;
ll n = readll();
ll s1 = readll(), v1 = readll(), s2 = readll(), v2 = readll();
swap(s1, v1);
swap(s2, v2);
if (n / v1 <= N) {
for (ll i = 0; i <= n / v1; i++)
res = max(res, i * s1 + (n - v1 * i) / v2 * s2);
}
else if (n / v2 <= N) {
for (ll i = 0; i <= n / v2; i++)
res = max(res, i * s2 + (n - v2 * i) / v1 * s1);
}
else {
for (ll i = 0; i < v1; i++)
res = max(res, i * s2 + (n - i * v2) / v1 * s1);
for (ll i = 0; i < v2; i++)
res = max(res, i * s1 + (n - i * v1) / v2 * s2);
}
printf("Case #%d: ", kase++);
Put(res);
puts("");
}
}