定价批量折扣的算法

时间:2010-04-02 22:31:05

标签: algorithm

我正在设计一个中国拍卖网站。

门票(5美元,10美元和20美元)可单独出售,也可通过套餐出售以获得折扣。 例如,有各种Ticket包:

  1. 5- $ 5门票=获得10%折扣
  2. 5- $ 10门票=获得10%折扣
  3. 5- $ 20门票=获得10%折扣
  4. 5- $ 5门票+ 5- $ 10门票+ 5- $ 20门票=享受15%折扣
  5. 当用户将购物车添加到购物车时,我需要找出最便宜的包裹。诀窍在于,如果一个用户增加4美元5张门票+ 5美元10张门票+ 5美元20美元门票,那么它仍应该给他包装#4,因为这对他来说是最便宜的。

    在找出解决此问题的算法方面有任何帮助,或任何提示都会非常感激。

    感谢

    修改

    我想出了答案,谢谢大家,但代码很长。

    如果有人仍有兴趣,我会发布答案代码。

3 个答案:

答案 0 :(得分:1)

在向顾客出售尽可能多的完整包裹之后,我们留下了3种类型(5美元,10美元,20美元)中所需的一些剩余N票。在您给出的示例中,所需的数量范围为0到5(6个可能的值)。因此,只有214种可能的残余组合(6 ** 3 - 2;减2,因为组合0-0-0和5-5-5是简并的)。只需预先计算每个组合的价格,就好像它是在没有包4的情况下购买的那样;将该计算与第4组的费用进行比较($ 148.75);这将告诉你每种组合最便宜的方法。

包的实际数量是否如此之大以至于完整的预计算不是一种可行的方法?

答案 1 :(得分:0)

一种方法是动态编程。

这个想法是,如果买方想要项目A的y,项目B的y和项目C的z,那么你应该为0< = x计算所有三元组(x',y',z') '< = x和0< = y'< = y和0< = z'< = z是获得B的A,y'和C'的至少x'的最便宜的方式。伪代码:

for x' = 0 to x
    for y' = 0 to y
        for z' = 0 to z
            cheapest[(x', y', z')] = min over all packages p of (price(p) + cheapest[residual demand after buying p])
            next_package[(x', y', z')] = the best package p

然后你可以从(x,y,z)向后工作,将next_package指示的包添加到购物车。

如果有多种不同的商品或每件商品很多,分店和装订可能是更好的选择。

答案 2 :(得分:0)

首先,计算您需要的完整Package 4的数量。让他们走开。

full_package_4_count = min(x, y, z) mod 5.

x = x - 5 * full_package_4_count
y = y - 5 * full_package_4_count
z = z - 5 * full_package_4_count

现在,可能仍然值得购买更多套餐4,即使他们实际上并不想买那么多门票。

有多少人可以?

partial_package_4_max = (max(x, y, z) + 4) mod 5

现在循环尝试以下各项:

best_price = 10000000
for partial_package_4_count = 0 to partial_package_4_max:
    -- Calculate how much we have already spent.
    price = (full_package_4_count + partial_package_4_count) * 175 * (1-0.15)

    -- Work out how many additional tickets we want.
    x' = max(0, x - 5 * partial_package_count)
    y' = max(0, y - 5 * partial_package_count)
    z' = max(0, z - 5 * partial_package_count)

    --- Add cost for additional tickets (with a 10% discount for every pack of 5)
    price = price + x' mod 5 * 25 * (1-0.10) + x' div 5 * 5
    price = price + y' mod 5 * 50 * (1-0.10) + x' div 5 * 10
    price = price + y' mod 5 * 100 * (1-0.10) + x' div 5 * 20

    if price < best_price
        best_price = price
        -- Should record other details about the current deal here too.