当前位置: 首页 > 后端技术 > PHP

记住优惠券的最佳使用算法

时间:2023-03-30 02:14:24 PHP

记住优惠券的最佳使用算法先说一下业务背景。公司出品的一款投资APP,投资金额可凭券抵扣。红包面额(100、50、30、10)优惠券使用规则:优先使用面额大的红包,即先使用数量少的红包。即将到期的组合优先使用即将到期的红包,即平均有效期最短的组合优先选择红包面额总和(总面额)最大的组合价值≤投资金额*1%)算法尝试前三种可以通过数据库检索和排序生成一个数组,最后一种将使用程序算法实现。一开始想的是背包法和穷举法。背包方法:说实话没看懂(尴尬),但是可以实现。但是获取不到使用的是哪张优惠券(简单的就是获取优惠券的Id很难)。穷举法:数据太多,不可控。优惠券最优算法1.0计算用户本次投资最多使用的优惠券数量(amount),得到用户的优惠券列表(couponList)(按前三个规则排序)直接上传代码:/***RedEnvelope最优算法*/私有函数getBestCoupon($couponList,$amount){$restAmount=$amount$couponIdList=[]foreach($couponas$couponList){if($restAmount>=$coupon->amount){$couponIdList[]=$优惠券->id;$restAmount=$restAmount-$coupon->金额;如果($restAmount==0)中断;}}返回[$couponIdList,$amount-$restAmount];有优惠券(50、30、30、30、30)用50元试,最高80用前30试,最高90,已经是极品了,打断程序(否则继续推演)问题是因为每次计算完就把红包推出数组,所以还是有问题。例如投资1600,用户有(100,50,30,30)。这不是最优的。也没有根据有效期的使用顺序。例如投资7000,用户有(50,30,30,30,10)。这样后面的三张牌都会用到,前三十张就没用了。这可以通过释放最后一张相同面额的卡片来解决。解决(算法2.0)不推出计算的优惠券,需要每次都把要计算的优惠券拿出来,所以程序复杂了很多,但是还是可以实现的,所以算法1.0还是会有问题,但这是根据很难毫无问题地按顺序获得优惠券。但是,这种面额的优惠券几乎没有机会出现。期待大神们更好的算法。