Algorithm 批量折扣定价算法

Algorithm 批量折扣定价算法,algorithm,Algorithm,我正在设计一个中国拍卖网站 门票(5美元、10美元和20美元)可以单独出售,也可以通过套餐获得折扣。 有各种票包,例如: 5-5美元门票=享受10%折扣 5-10美元门票=享受10%折扣 5-20美元门票=享受10%折扣 5-5美元门票+5-10美元门票+5-20美元门票=享受15%的折扣 当用户向购物车添加门票时,我需要找出最便宜的套餐。诀窍是,如果用户添加了4-5美元的门票+5-10美元的门票+5-20美元的门票,它仍然应该给他4号套餐,因为这对他来说是最便宜的 如果您能帮助我们找到解决这个

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

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

  • 5-5美元门票=享受10%折扣
  • 5-10美元门票=享受10%折扣
  • 5-20美元门票=享受10%折扣
  • 5-5美元门票+5-10美元门票+5-20美元门票=享受15%的折扣
  • 当用户向购物车添加门票时,我需要找出最便宜的套餐。诀窍是,如果用户添加了4-5美元的门票+5-10美元的门票+5-20美元的门票,它仍然应该给他4号套餐,因为这对他来说是最便宜的

    如果您能帮助我们找到解决这个问题的算法,或者提供任何提示,我们将不胜感激

    谢谢

    编辑

    我找到了答案,谢谢大家,但是代码很长


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

    一种方法是动态规划


    其想法是,如果买方想要项目A的x、项目B的y和项目C的z,那么您应该计算所有三元组(x',y',z'),0首先,计算您需要多少完整的包装4s。让他们让开

    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
    
    现在,尽管他们实际上不想买那么多票,但可能仍然值得再买一些4s套餐

    会有多少人

    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.
    
    最佳价格=10000000
    对于部分_包_4_计数=0到部分_包_4_最大值:
    --计算一下我们已经花了多少钱。
    价格=(完整包装数量+部分包装数量)*175*(1-0.15)
    --算出我们还要多少张票。
    x'=最大值(0,x-5*部分包装计数)
    y'=最大值(0,y-5*部分包计数)
    z'=最大值(0,z-5*部分包计数)
    ---增加额外门票费用(每包5张可享受10%的折扣)
    价格=价格+x'模块5*25*(1-0.10)+x'分区5*5
    价格=价格+y'模块5*50*(1-0.10)+x'分区5*10
    价格=价格+y'模块5*100*(1-0.10)+x'分区5*20
    如果价格<最佳价格
    最佳价格=价格
    --也应该在这里记录当前交易的其他细节。
    
    在向客户销售尽可能多的完整套餐后,我们只剩下3种类型的剩余N张票($5、$10、$20)。在您给出的示例中,所需的数量范围为0到5(6个可能的值)。因此,只有214个可能的残差组合(6**3-2;减去2,因为组合0-0-0和5-5-5是退化的)。只需预先计算每种组合的价格,就好像购买时没有包装4一样;将这一计算与第4包的费用(148.75美元)进行比较;这将告诉您每种组合的最便宜方法


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

    我不得不查找“中国拍卖”,看看它是否是一个著名的拍卖系统,或者你是否只是在用中文编写网站。事实证明是前者::)在你的例子中,他们只会得到20美元门票的10%折扣吗?还是百分之十?或者任何数量超过5张的票都可以打9折?@Jeff B该套餐中的任何票都可以打10折,所以如果我再加6-20美元的票,我可以打5折,你可以享受多个非重叠套餐?因此,如果我购买3-5美元6-10美元和5-20美元,我将支付15美元+55美元+90美元=$160?@高性能标记,我倾向于按总和(数量)描述对打包进行排序,然后循环遍历打包,将组合添加到列表中。一旦我们计算出正确的价格,我会将这些结果缓存到一个表中,这样下次当一些人添加相同的数量时,我们就已经知道要给他什么包了。如果有办法做到这一点而不循环,我不会感到惊讶。如果性能是一个因素,我会预先计算每一个可能的组合多达100张门票,或任何数额永远不会发生在您的网站上。这似乎是一个好办法一般。我试图想出一个贪婪的算法,但我找到了一个给出错误答案的例子。你应该考虑10%套餐的组合可能比15%套餐更适合给定的需求;考虑5X $ 5,5X $ 10,4X $ 20。@色度是,“购买无包装4”是为了包括这样的想法,你会出售别人的包1, 2,或3时,他们的剩余订单数量包括5。您的5-5-4示例将是147.50美元,不包括套餐4(套餐1、套餐2,再加上4张20美元的个人票),这比套餐4便宜。
    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.