产品 A 成本 10 美元,B 成本 3 美元,C 成本 0.50 美元。一个人花 100 美元买了 100 件物品。该人购买了每种物品的数量。
我找到了答案——
94 * 0.5 = 47
1 * 3 = 3
5 * 10 = 50
但是我无法在 java 中实现它作为我从 Hit and Trial 中得到结果的解决方案。解决这个问题的算法是什么
普通的蛮力:
for (int i1 = 0; i1 <= 10; i1++) {
for (int i2 = 0; i2 < 34; i2++) {
int i3 = 100 - i2 - i1;
int total = i1 * 10 + i2 * 3 + i3 / 2;
if (total == 100 && i3 % 2 == 0)
System.out.println(i1 + " * 10 + " + i2
+ " * 3 + " + i3 + " * 0.5 = 100");
}
}
给出两个答案:
PS 当然,这不是最佳解决方案,但仅适用于三个项目和 100 个总量 - 很好(并且从编码所需的时间点来看是最佳的)。
你需要实现你的算法来解决这两个方程
A + B + C = 100 -----------(1)
10A + 3B + 0.5C = 100 -----------(2)
由(2),我们可以得出:
C = 100 - A - B
将此信息代入 (2)
10A + 3B + 0.5 * ( 100 - A - B) = 100
This reduces to
19A + 5B = 100
然后你可以扣除:
B = 20 - (19A/5)
现在,尝试找出(使用 int 循环)的“整体”值A
将B
变成一个整体值(通常在此类问题中,您总是购买整体商品——如水果,没有分数)
你会发现,当 A=5 时,B=1。
继续以这种方式求解方程,并将 A、B 和 C 替换为 Java 变量,您将能够提供解决方案。
这两种解决方案都很容易找到。Ring Bearer 已经给出了几乎所有的方法。环承载结束于:
B = 20 - (19A/5)
不过,我们还知道其他一些事情:
A, B, and C are all non-negative integer values.
这意味着 19A/5 必须是 (1) 整数(否则 B 将不是整数),并且 (2) 最多为 20(否则 B 将为负数)。这意味着对于 (1),A 必须是 5 的倍数,对于 (2),A 最多只能是 5。
另请注意,要求 19A/5 <= 20 可以重写为:
19A <= 100
A 只有两个值满足这一点:0 和 5。找到所有解决方案的一种非常快速的方法是执行以下操作:
for (A = 0; 19*A <= 100; A += 5)
{
// Show the solution for this value of A (with B = 20 - 19A/5 and C = 100 - A - B).
}