给定价格增加的最大项目算法,间隔为N

时间:2015-08-09 20:52:14

标签: algorithm math optimization

我在看这里发布的问题:

Algorithm for calculating total cost in groups of N

并且想知道如何确定一个人可以购买的最大物品,因为每N件物品的成本增加X.

举例来说,如果我有$ 20和要购买的东西,以$ 1的价格启动,但增加了$ 1每5个项目(作为一个例子),我能够购买他们的11,以$ 2离开(5美元1美元+ 5美元2美元+ 1美元3美元= 18美元)。

是否有可用于解决此问题的公式?

2 个答案:

答案 0 :(得分:1)

当我们从1开始并且每n次增加1时,我将解释更简单的版本。在这里,我们需要先nn,下一个2nn,依此类推。假设我们可以获得最多k个完整组(总项目是n的倍数)。所以我们的总费用将是

n + 2*n + 3*n + ...+ k*n
This must be less than S. So
(1 + 2 + .... + k) * n <= S
=> k * (k+1) * n / 2 <= S
=> n * k ^ 2 + n * k - 2 * S=0
Solving for k we get
k = (-n + sqrt(n ^ 2 + 8 * n * S )) / (2 * n)    // take floor value

现在剩下的钱是

S1 = S-(n * k * (k + 1)) / 2

我们仍然可以购买的商品数量是

a = S1 / (k + 1)

总数

k * n + a

剩下的钱是

S1 mod (k + 1)

例如S = 20n = 5

k = (-5 + sqrt(5 ^ 2 + 8 * 5 * 20))/(2 * 5) = 2.37 = 2  // floor
S1 = 20 - ( 5 * 2 * 3) / 2=5
a = 5 / (2 + 1)=1.66.. = 1 //floor
total = 2 * 5 + 1 = 11
money left = 5 mod 3 =2

a开始,您可以类似地推导出通用公式,每x次增加值n。在这种情况下,k应该是

k = (sqrt(((x - 2 * a) * n) ^ 2 + 8 * n * x * S) + (x - 2 * a)* n) / (2 * n * x)
v = a + k * x
S1 = S - (2 * a + (k - 1) * x) * k * n / 2
y = S1 / v
total = k * n + y
left = S1 mod v

答案 1 :(得分:0)

在购买价格的k补丁

之后,先将价格作为价格

让购买前k个补丁的成本为F(k),然后

让M成为你拥有的钱,你可以购买最多的补丁k * satify

购买k *补丁后,您还可以购买剩余的

项。

因此,您可以购买的总项目是:k * + r *。

我确信这是你期望的公式,: - )。