我正在寻找一种算法来以最灵活的方式计算:
我正在进行成本计算,正在寻找一种优雅的解决方案来解决以下问题:
单位(U)可以是任意数字。
可以有无限数量的阈值(T),但它们都与定价(P)i.E。相关:
T:[10,200,1500,2712]
P:[5,4,3,1,10]
低于10的任何费用5欧元,
10-200之间的任何单位费用4€,
200-1500之间的任何单位花费3€,
1500-2712之间的任何单位花费1欧元,
2712以上的任何费用都是10欧元
所以1600的单位将花费:
50(单位从0到10)+ 760(单位从10到200)+ 3900(单位从200到1500)+ 100(剩余100单位在1500以上)= 4810€
计算这个的好方法是什么?
虽然记住任何值都是可变的,但所有阈值和相应的价格和单位可以随时变化。 (唯一固定的东西,价格总是与阈值相关)
€:我尝试使用嵌套的if / else语句做一些事情,但它完全混乱并且根本不灵活,因为阈值也可能超过4个值......
答案 0 :(得分:1)
我要做的是稍微重述一下这个问题。我将定义一个数据结构,该数据结构具有给定价格点的单位数量的有序列表。
所以在你的阈值示例中,我将制作我的新阈值数组(带宽大小的BS):
BS:[10,190,1300,1212]
因此T[0]
与BS[k]
相同。然后T[k]-T[k-1]
将为menu.component.ts
有了这个,我们的定价数组我会使用以下算法。
这实际上是在您的示例中执行的操作。如果您的号码已经过去,或者您的总数落在一个范围内,那么您可以在价格区间内添加该区间的全部价值。
我从T转换为BS只是因为它看起来有点整洁(对我而言)不必在循环本身中计算带宽。该算法应该非常简单地转换为代码(for循环和几个ifs应该做的伎俩)。
答案 1 :(得分:1)
var T = [10, 200, 1500, 2712];
var P = [5, 4, 3, 1, 10];
function calculate(n){
var i = 0;
var current = 0;
var cost = 0;
while(n > 0 && i < T.length){
var min = Math.min(T[i] - current, n);
current += min;
cost += P[i] * min;
n -= min;
i += 1;
}
if(n > 0){
cost += P[i] * n;
}
return cost;
}
在这里,我将跟踪使用变量当前计算成本的单位。最后,我正在检查是否有剩余的单位尚未计算成本,我将P中的最后一个元素与剩余单位相乘以得到总成本。