我是一个完全的算法笨蛋,我有这个问题,我需要找到购买未知数量的小部件的最低成本,无论是按单价还是通过批量购买x个小部件……我相信一个例子会有所帮助的:
1) Widget单价为0.05美元2)批量Widget定价为每100个Widget 4.00美元
假设我想买140件小配件-
a)按单位计算成本为140 x $0.05c => $7.00 b)按批次计算成本为2批次100 @ $4.00 => $8.00 (超出的60个部件可忽略)
因此,在这种情况下,按单位购买要便宜1.00美元
但是,如果我想买190个小配件,那么-
a)按单位计算成本为190 x $0.05c => $9.50 b)按批次计算成本为2批次100 @ $4.00 => $8.00 (超出的10个部件可忽略)
在这种情况下,批量购买的价格更便宜。
因此,我需要找出如何通过编程找出两种方法之间的“引爆点”,以获得最便宜的价格。
我希望我已经解释好了,我相信这是一个简单的答案,但今天我的大脑很快就消失了!
提亚
编辑::
好的,对不起--我意识到我没有说得那么清楚--正如有人指出的那样,批次和单元的混合也是可能的,所以对于140小部件示例,也可以是1批次和40个单元。
我试图实现的是以编程方式找到最便宜的方式购买X个小工具,每个在$XX定价,也给出了一个批次价格$YY的NN小工具。
购买批次产生的任何多余小部件都没有问题,即可以购买X个以上的小部件,但不能少于X个
因此,对于140个示例,1批次@ $4.00 + 40个单位@ $0.05,=> $6.00,这是我认为最便宜的。对于190个例子来说,2批仍然是最便宜的,我认为1批+ 90个单位是8.50美元……
我希望有一些简洁的等式可以做到这一点:)
发布于 2013-04-12 23:55:16
这个问题的答案非常简单,如果你以另一种方式思考它的话。你已经知道价格的“临界点”了。是8.00美元。您不知道的是单位中的点,即$8.00除以$0.05 (每个单位) => 160单位。
请注意,也有机会购买100个单位@ $4.00和60个单位@0.05美元,结果是总共7.00美元。这是第三种可能性,你可能会也可能不会考虑。
编辑:编辑之后,事情变得更加简单:
您在$XX有1个项目,在$YY有一批NN项目。假设$YY/NN < $XX (意思是批处理实际上省钱),您所要做的就是:
购买剩余数量
发布于 2013-04-13 00:22:54
我用python写了一个基本的暴力风格的脚本来比较两个选项的价格(最多1000个元素)。这不是最快也不是最优雅的方法,但它似乎是有效的。
输出的格式为:(<unit-count>, (<per-unit-cost>, <per-batch-cost>))
import math
import itertools
import pprint
unitList = range(1000)
pricePerUnit = .05
pricePerBatch = 4.0
numberPerBatch = 100.0
def calculatePerUnit(units):
""" Calculate the price of buying per unit
"""
return units * pricePerUnit
def calculatePerBatch(units):
""" Calculate the price of buying per batch
"""
return math.ceil(units / numberPerBatch) * pricePerBatch
def main():
""" Execute the script
"""
perUnit = map(calculatePerUnit, unitList)
perBatch = map(calculatePerBatch, unitList)
comparisonList = zip(perUnit, perBatch)
perUnitCheaperPriceList = list(itertools.ifilter(lambda x: x[0] < x[1], comparisonList))
perUnitCheaperUnitList = map(lambda x: int(x[0] / .05), perUnitCheaperPriceList)
pprint.pprint(zip(perUnitCheaperUnitList, perUnitCheaperPriceList))
if __name__=="__main__":
main()结果是:
[gizmo@test ~]$ python TippingPoint.py
[(1, (0.050000000000000003, 4.0)),
... These are sequential values I left out for brevity ...
(79, (3.9500000000000002, 4.0)),
(101, (5.0500000000000007, 8.0)),
... These are sequential values I left out for brevity ...
(159, (7.9500000000000002, 8.0)),
(201, (10.050000000000001, 12.0)),
... These are sequential values I left out for brevity ...
(239, (11.950000000000001, 12.0)),
(301, (15.050000000000001, 16.0)),
... These are sequential values I left out for brevity ...
(319, (15.950000000000001, 16.0))]https://stackoverflow.com/questions/15975684
复制相似问题