国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

記一次優(yōu)惠券最優(yōu)使用算法

Lowky / 3220人閱讀

摘要:記一次優(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

相關(guān)文章

  • 【FAILED】一次Python后端開發(fā)面試的經(jīng)歷

    摘要:正確的思路是等概率隨機只取出共個數(shù),每個數(shù)出現(xiàn)的概率也是相等的隨機輸出把一段代碼改成,并增加單元測試。代碼本身很簡單,即使沒學(xué)過也能看懂,改后的代碼如下但是對于單元測試則僅限于聽過的地步,需要用到,好像也有別的模塊。 在拉勾上投了十幾個公司,大部分都被標(biāo)記為不合適,有兩個給了面試機會,其中一個自己覺得肯定不會去的,也就沒有去面試,另一個經(jīng)歷了一輪電話面加一輪現(xiàn)場筆試和面試,在此記錄一下...

    kohoh_ 評論0 收藏0
  • 一次騰訊霸面---前端

    摘要:客戶端的瀏覽器根據(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)、算法、計...

    ralap 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<