如何用算法计算多件商品的最佳优惠方案?

如何用算法计算多件商品的最佳优惠方案?

多商品优惠计算算法

问题:

如何计算多件商品的最佳优惠方案,既考虑到每个商品的折扣,又考虑多个商品的满减优惠。

方法:

采用回溯法遍历所有可能性,寻找使用满减优惠后价格最优的组合。

步骤:

  1. 计算每个商品的原始总价和折扣后总价:

    • 查看每个商品的优惠信息,计算出打折后的价格。
  2. 找出所有可能的满减优惠组合:

    • 分别对每种满减优惠,查找可以使用该满减优惠的商品组合。
  3. 回溯法遍历所有满减优惠组合:

    • 对于每个满减优惠组合,递归尝试用该组合进行满减,并计算折扣后的总价。
    • 同时,记录每个商品使用的满减优惠和折扣信息。
  4. 选择折扣后的总价最优的组合:

    • 从所有尝试的满减优惠组合中,选择使用满减优惠后总价最优的组合。

示例代码(JavaScript):

const compute = (goods = []) => {   // 初始化   const discountgoodsmap = new map();   let total = 0;   for (let good of goods) {     // 计算每个商品的原始总价和折扣后总价     good.totalprice = good.price * good.num;     good.totaldisprice = good.totalprice;      // 记录每个商品的满减优惠信息     const spcelist = good.spcelist;     spcelist.foreach(id => {       let spce = tb_spce.find(s => s.id === id);       if (spce.type === "折扣" && good.num >= spce.full) {         // 打折         good.totaldisprice = math.min(good.totaldisprice, good.totalprice * spce.reduction);       } else if (spce.type === "满减") {         // 记录满减优惠         let gs = discountgoodsmap.get(spce);         if (!gs) {           gs = [];           discountgoodsmap.set(spce, gs);         }         gs.push(good);       }     });     total += good.totaldisprice;   }    // 找出所有满减优惠组合   const compose = [];   discountgoodsmap.foreach((v, k) => {     discomposebacktrace(0, v, k.full, k.reduction, [], compose, k.id);   });    // 回溯法遍历所有满减优惠组合,寻找最优解   const res = { total: total, discount: 0, compose: [] };   composebacktrace(0, compose, [], new set(), res, 0);    // 计算最终折扣后的总价   res.total = res.total - res.discount;    return res; };
登录后复制

应用示例:

给定商品列表 tb_goods 和优惠列表 tb_spce,计算商品组合 [{“goodsid”: 1, “num”: 3}, {“goodsid”: 2, “num”: 6}, {“goodsid”: 3, “num”: 3}] 的最佳优惠方案。

结果:

{   "total": 93.1,   "discount": 11,   "compose": [     [       [1, 6, 28.5, 102],       [2, 6, 25.2, 102]     ],     [[4, 5, 33.6, 104]]   ] }
登录后复制

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容