摘要:記一次優(yōu)惠券最優(yōu)使用算法先說一下業(yè)務(wù)背景。公司做的一個投資的,投資金額可以用優(yōu)惠券抵扣。但是無法獲取具體使用了哪張優(yōu)惠券簡單就是很難獲得優(yōu)惠券的窮舉法數(shù)據(jù)太多,不可控。但是這種面額的優(yōu)惠券出現(xiàn)幾率幾乎沒有請教期待有大神給出更好的算法
記一次優(yōu)惠券最優(yōu)使用算法
先說一下業(yè)務(wù)背景。公司做的一個投資的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%)
算法嘗試前面三個都可以通過數(shù)據(jù)庫檢索排序?qū)崿F(xiàn)生成一個數(shù)組,最后一個就要使用程序算法實現(xiàn)了。
一開始有想過背包法、窮舉法。
背包法:說實在的,沒看懂(比較尷尬),實現(xiàn)是可以實現(xiàn)。但是無法獲取具體使用了哪張優(yōu)惠券(簡單就是很難獲得優(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]; }實例解析:用戶投資9000,用戶有優(yōu)惠券(50,30,30,30,30)
用50塊嘗試,最多80
用第一個30嘗試,最多90,已經(jīng)最優(yōu),中斷程序(否則繼續(xù)向下類推)
問題因為每次算完就把該紅包從數(shù)組中推出,這樣還是存在問題。例如投資1600,用戶有(100,50,30,30)。這樣就不會出現(xiàn)最優(yōu)。
解決(算法2.0)不把計算過優(yōu)惠券推出,需要每次把要計算那張優(yōu)惠券多帶帶拿出來
這樣程序復(fù)雜了很多,但還是可以實現(xiàn)的
這樣還是會出現(xiàn)算法1.0的問題,不過這種按照順序取優(yōu)惠券很難不出現(xiàn)問題。但是這種面額的優(yōu)惠券出現(xiàn)幾率幾乎沒有
請教期待有大神給出更好的算法
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/23215.html
摘要:正確的思路是等概率隨機只取出共個數(shù),每個數(shù)出現(xiàn)的概率也是相等的隨機輸出把一段代碼改成,并增加單元測試。代碼本身很簡單,即使沒學(xué)過也能看懂,改后的代碼如下但是對于單元測試則僅限于聽過的地步,需要用到,好像也有別的模塊。 在拉勾上投了十幾個公司,大部分都被標(biāo)記為不合適,有兩個給了面試機會,其中一個自己覺得肯定不會去的,也就沒有去面試,另一個經(jīng)歷了一輪電話面加一輪現(xiàn)場筆試和面試,在此記錄一下...
摘要:客戶端的瀏覽器根據(jù)雙方同意的安全等級,建立會話密鑰,然后利用網(wǎng)站的公鑰將會話密鑰加密,并傳送給網(wǎng)站。地址必須和一個網(wǎng)絡(luò)掩碼對應(yīng)使用缺一不可。網(wǎng)絡(luò)掩碼的主要作用是告訴計算機如何從地址中析取網(wǎng)絡(luò)標(biāo)識和主機標(biāo)識。 霸面的是前端實習(xí)生崗位,當(dāng)時聽同學(xué)說前端缺人,還特意設(shè)了一個霸面區(qū),就去溜了個彎兒,畢竟不試試,怎么知道自己有多菜呢o( ̄︶ ̄)o一面技術(shù)面,面試官關(guān)注的點一直在數(shù)據(jù)結(jié)構(gòu)、算法、計...
閱讀 3149·2021-11-22 13:54
閱讀 3435·2021-11-15 11:37
閱讀 3598·2021-10-14 09:43
閱讀 3496·2021-09-09 11:52
閱讀 3595·2019-08-30 15:53
閱讀 2457·2019-08-30 13:50
閱讀 2055·2019-08-30 11:07
閱讀 886·2019-08-29 16:32