Algorithm 给定以N为间隔的价格上涨,可购买的最大项目的算法

Algorithm 给定以N为间隔的价格上涨,可购买的最大项目的算法,algorithm,math,optimization,Algorithm,Math,Optimization,我在看张贴在这里的问题: 他想知道,如果成本每N件物品增加X,如何确定一个人可以购买的最大物品 例如,如果我有20美元,想买一件价格为1美元的东西,但每5件增加1美元(作为一个例子),我就可以买11件,剩下2美元(5件在1美元+5件在2美元+1件在3美元=18美元) 有没有一个公式可以用来解决这个问题?当我们从1开始,每n次增加1时,我将解释更简单的版本。这里我们需要n用于第一个n项目,需要2n用于下一个n项目等等。假设我们可以得到最多k个完整组(总项目是n的倍数)。所以我们的总成本是 n +

我在看张贴在这里的问题:

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

例如,如果我有20美元,想买一件价格为1美元的东西,但每5件增加1美元(作为一个例子),我就可以买11件,剩下2美元(5件在1美元+5件在2美元+1件在3美元=18美元)


有没有一个公式可以用来解决这个问题?

当我们从1开始,每n次增加1时,我将解释更简单的版本。这里我们需要
n
用于第一个
n
项目,需要
2n
用于下一个
n
项目等等。假设我们可以得到最多
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
我们仍然可以购买的物品数量是

a = S1 / (k + 1)
总数为

k * n + a
剩下的钱是

S1 mod (k + 1)
例如,使用
S=20
n=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
开始,每隔
n次将值增加
x
时,可以推导出一般公式。在这种情况下,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

首先让base为价格,k补丁购买后的价格为

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

让M成为你的钱,你能买到的最多补丁数k*satify

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

项目

因此,您可以购买的总物品是:k*+r*


我相信这就是您期望的公式,:-)。

首先,感谢您的帮助!第一个公式似乎很有效,但第二个公式(允许变量增加)似乎对我不起作用,即使是同一个增加1的例子。可能是我做错了什么,但是k值对我来说太离谱了。我应该对sqrt的结果进行平方处理,对吗(这是我唯一能看到我出错的地方)?Hrm。。。您是否使用其他基准/增量/间隔进行了测试?新的方法对于初始示例中使用的变量很有效,但当我尝试使用其他值时,再次失败=(再说一遍,可能是我做错了什么……但例如,当我插入20美元,基本成本为5,每5件物品增加5美元时,它说我可以买20美元,当然这是不可能的。)right@storkupine它确实给了我正确的结果。也许你遗漏了一些括号?(对于你的例子a=x=n=5和S=20)哦,我以前没有看到新的v/s1 etc公式。这太棒了!谢谢!给定一个函数f(x)表示x购买后的价格,让g是这个函数wrt x的积分。“算法”就是方程g(x)=的解,四舍五入为整数值。
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