摘要:記一次優(yōu)惠券最優(yōu)使用算法先說一下業(yè)務(wù)背景。公司做的一個(gè)投資的,投資金額可以用優(yōu)惠券抵扣。但是無法獲取具體使用了哪張優(yōu)惠券簡(jiǎn)單就是很難獲得優(yōu)惠券的窮舉法數(shù)據(jù)太多,不可控。但是這種面額的優(yōu)惠券出現(xiàn)幾率幾乎沒有請(qǐng)教期待有大神給出更好的算法
記一次優(yōu)惠券最優(yōu)使用算法
先說一下業(yè)務(wù)背景。公司做的一個(gè)投資的APP,投資金額可以用優(yōu)惠券抵扣。紅包面額(100,50,30,10)
優(yōu)惠券使用規(guī)則:優(yōu)先使用大面額的紅包,即優(yōu)先使用張數(shù)最少的紅包組合
優(yōu)先使用有限制的紅包,即優(yōu)先使用有限制紅包張數(shù)占比最大的組合
優(yōu)先使用即將過期的紅包,即優(yōu)先使用平均有效期最短的組合
選擇紅包面額之和最大的組合(面額總值≤投資額*1%)
算法嘗試前面三個(gè)都可以通過數(shù)據(jù)庫(kù)檢索排序?qū)崿F(xiàn)生成一個(gè)數(shù)組,最后一個(gè)就要使用程序算法實(shí)現(xiàn)了。
一開始有想過背包法、窮舉法。
背包法:說實(shí)在的,沒看懂(比較尷尬),實(shí)現(xiàn)是可以實(shí)現(xiàn)。但是無法獲取具體使用了哪張優(yōu)惠券(簡(jiǎn)單就是很難獲得優(yōu)惠券的Id)
窮舉法:數(shù)據(jù)太多,不可控。
優(yōu)惠券最優(yōu)算法1.0算出用戶本次投資最大使用優(yōu)惠券總額(redAmount)、獲取用戶的優(yōu)惠券列表(redCoupons)(已按前三規(guī)則排序)直接上代碼:
public function dealCoupon() { $redCoupons =[]; $restRedAmount = 100; $redCouponIdLists = []; $restRedAmounts = []; $arrCount = count($redCoupons); for ($i=0; $i<$arrCount; $i++) { list($redCouponIdList, $restRedAmount) = getBestCoupon($redCoupons, $restRedAmount); if ($restRedAmount == 0) { $bestCouponIdList = $redCouponIdList; break; } $redCouponIdLists[] = $redCouponIdList; $restRedAmounts[] = $restRedAmount; array_shift($redCoupons); } if (empty($bestCouponIdList)) { $pos = array_search(min($restRedAmounts), $restRedAmounts); $bestCouponIdList = $redCouponIdLists[$pos]; } } /** * 紅包最優(yōu)算法 */ private function getBestCoupon($redCoupons, $restRedAmount) { $redCouponAmount = 0; foreach ($redCoupons as $redCoupon) { if ($restRedAmount >= $redCoupon->getAmount()) { $redCouponAmount = $redCouponAmount + $redCoupon->getAmount()); $redCouponIdList[] = $redCoupon->getCouponId(); $restRedAmount = $restRedAmount - $redCoupon->getAmount(); if ($restRedAmount == 0) break; } } return [$redCouponIdList, $restRedAmount]; }實(shí)例解析:用戶投資9000,用戶有優(yōu)惠券(50,30,30,30,30)
用50塊嘗試,最多80
用第一個(gè)30嘗試,最多90,已經(jīng)最優(yōu),中斷程序(否則繼續(xù)向下類推)
問題因?yàn)槊看嗡阃昃桶言摷t包從數(shù)組中推出,這樣還是存在問題。例如投資1600,用戶有(100,50,30,30)。這樣就不會(huì)出現(xiàn)最優(yōu)。
解決(算法2.0)不把計(jì)算過優(yōu)惠券推出,需要每次把要計(jì)算那張優(yōu)惠券多帶帶拿出來
這樣程序復(fù)雜了很多,但還是可以實(shí)現(xiàn)的
這樣還是會(huì)出現(xiàn)算法1.0的問題,不過這種按照順序取優(yōu)惠券很難不出現(xiàn)問題。但是這種面額的優(yōu)惠券出現(xiàn)幾率幾乎沒有
請(qǐng)教期待有大神給出更好的算法
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23215.html
摘要:正確的思路是等概率隨機(jī)只取出共個(gè)數(shù),每個(gè)數(shù)出現(xiàn)的概率也是相等的隨機(jī)輸出把一段代碼改成,并增加單元測(cè)試。代碼本身很簡(jiǎn)單,即使沒學(xué)過也能看懂,改后的代碼如下但是對(duì)于單元測(cè)試則僅限于聽過的地步,需要用到,好像也有別的模塊。 在拉勾上投了十幾個(gè)公司,大部分都被標(biāo)記為不合適,有兩個(gè)給了面試機(jī)會(huì),其中一個(gè)自己覺得肯定不會(huì)去的,也就沒有去面試,另一個(gè)經(jīng)歷了一輪電話面加一輪現(xiàn)場(chǎng)筆試和面試,在此記錄一下...
摘要:客戶端的瀏覽器根據(jù)雙方同意的安全等級(jí),建立會(huì)話密鑰,然后利用網(wǎng)站的公鑰將會(huì)話密鑰加密,并傳送給網(wǎng)站。地址必須和一個(gè)網(wǎng)絡(luò)掩碼對(duì)應(yīng)使用缺一不可。網(wǎng)絡(luò)掩碼的主要作用是告訴計(jì)算機(jī)如何從地址中析取網(wǎng)絡(luò)標(biāo)識(shí)和主機(jī)標(biāo)識(shí)。 霸面的是前端實(shí)習(xí)生崗位,當(dāng)時(shí)聽同學(xué)說前端缺人,還特意設(shè)了一個(gè)霸面區(qū),就去溜了個(gè)彎兒,畢竟不試試,怎么知道自己有多菜呢o( ̄︶ ̄)o一面技術(shù)面,面試官關(guān)注的點(diǎn)一直在數(shù)據(jù)結(jié)構(gòu)、算法、計(jì)...
閱讀 3158·2021-11-22 13:54
閱讀 3450·2021-11-15 11:37
閱讀 3612·2021-10-14 09:43
閱讀 3508·2021-09-09 11:52
閱讀 3612·2019-08-30 15:53
閱讀 2474·2019-08-30 13:50
閱讀 2065·2019-08-30 11:07
閱讀 897·2019-08-29 16:32