UVA-12325 Zombie's Treasure Chest 思维,枚举
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 \times S2 = S2 \times 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("");
}
}