日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【实战篇】| 小鹿教你用动态规划撩妹的正确方式

發布時間:2024/9/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【实战篇】| 小鹿教你用动态规划撩妹的正确方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者 |? 小鹿

來源 |? 一個不甘平凡的碼農



都說程序員是直男,聊天聊不過三句,看下邊這位朋友求助小鹿,抱怨說,學習數據結構那么難,除了優化程序算法,其他的啥都不能干,學它干啥,哎,撩個妹子都撩不到。



說真的,我都嫌棄他,哈哈,嫌棄歸嫌棄,我還想教給你撩妹的正確方式的,該說不說的,為了能讓這位朋友可以撩上妹子,小鹿耗時假期三天時光,出了這篇文章,希望幫助各位宅男們脫單。


故事情節正在生成中......


故事背景


快過年了,很多吃貨都安奈不住了,也包括愛吃零食的小鹿。天貓超市也很多“滿減活動”。我想很多程序員和小鹿一樣,會在天貓超市有“滿減活動”的時候才會買一大些零食,一次性吃個夠。



那么機會來了,你是個吃貨,很多小姐姐也是吃貨,何不借此機撩一撩呢?


這怎么撩?憑著你學了數據結構與算法嘛?憑著你是做底層架構的?憑著你會....


這點小事,包在小鹿身上了,下面就給你來個用數據結構與算法實戰撩小姐姐,讓小姐姐對你的滿意度從 0 飆升到 100。


?開始搭訕


很多女生說程序員都是直男,沒錯,我也承認我也是其中一位。



直男是程序員的通病,但是程序員這個職業也賦予了我們隨機應變能力呀,懂得自救才行(很多宅男們就敗在這了)。


你不仔細想想,作為一個非程序員的妹子,誰喜歡跟你閑著沒事討論這自己不懂的東西。



?幫小姐姐解決問題


這個時候,該你展現真正的技術了,可不要搞砸了,不認你的印象又被小姐姐大大降低。


那么問題來了,怎么選擇購物車中的零食才能滿足盡最大可能湊到“滿減活動”呢?


1、動態規劃


我們就會用到動態規劃去計算,動態規劃在數據結構與算法中屬于重點也是難點,也會涉及到遞歸,這部分也是基礎中最難的。之前很多讀反饋,說分享的教程太基礎,所以關于遞歸基礎,這里不講了,可以公眾號后臺回復“遞歸”,獲取基礎教程。


首先,我們將復雜問題簡單化,假如我們購物車中有 2元、4元、2元、3元、6元的五個價格的零食。假如買夠 9 元,我們立減 5 元,我們應該湊滿 9 元或者盡可能的大于 9 元并接近 9 元呢?


其實這個問題一眼就能選擇出來,但是我們為了將復雜問題解決掉,我們還是用動態規劃去解決。


其實這個問題類似于遞歸,第一個零食買不買有兩種選擇,一個是買,一個就是不買,第二個、第三個、第四個..... 都有兩種選擇,這時候我們可以用到遞歸。


你會說,我們可以用回溯算法把所有可能列出來呀,選擇合適的不就好了?記住,我們是程序員,要盡可能的降低時間復雜度,等你全部窮舉出來,估計你的小姐姐早就等不及下單了。


這個問題用動態規劃怎么解決呢?


我們用(a,b)來表示每個零食是否被選擇,a 表示對第 a 個零食是否購買,b 表示已選擇購買零食的總價格。


2、用遞歸樹來表示



上邊的遞歸樹把所有的情況都列舉了出來,就像是我們用到的回溯算法,之所以時間復雜度很高,是因為遞歸樹中有的層次很多重復計算的步驟,如果我們把重復計算的狀態只記錄一種不就可以減少時間復雜度,提高程序效率了嗎?


上邊的遞歸樹怎么表示呢?我們可以一個二維數組,tree[a][b],a 表示第 a 個零食是否購買,b 表示已選擇購買零食的總價格。


上邊遞歸樹我們用代碼實現,如下:


1/**
2?*?
3?*?@param?prices?各個商品的價格
4?*?@param?n?商品的個數
5?*?@param?w?滿減條件(滿?199-99元)
6?*/
7public?static?void?ShoppingSnacks(int[]?prices,int?n,int?w){
8????boolean[][]?tree?=?new?boolean[n][w+1];
9????tree[0][0]?=?true;
10????tree[0][prices[0]]?=?true;
11????//動態規劃
12????for?(int?i?=?1;?i?<?n;?i++)?{
13????????//?不購買當前商品
14????????for(int?j?=?0;j?<=w;?j++)?{
15????????????//尋找上一個商品決策狀態
16????????????if(tree[i-1][j]?==?true)?{
17????????????????tree[i][j]?=?true;
18????????????}
19????????}
20
21????????//?購買當前商品
22????????for(int?j?=?0;j?<=w-prices[i];?j++)?{
23????????????//尋找上一個商品決策狀態
24????????????if(tree[i-1][j]?==?true)?{
25????????????????tree[i][j+prices[i]]?=?true;
26????????????}
27????????}
28?????}
29}
30


上邊代碼執行完成,所有的情況我們就用二維數組來表示,零食購買的決策狀態如下:

橫坐標代表已經從購物車選擇的零食的總價格;
縱坐標代表對第 i 個零食進行選擇是否購買;


但是上邊的代碼存在一個問題,求得的最大滿足滿減條件價格是盡可能小于接近 9 元,我們想要達到的結果是盡可能的達到或超過接近滿減條件。怎么做呢?


我們做出以下修改,讓滿減價格盡可能的大三倍,就是說我們將滿足 9 元提升到 27 元,也就是說,在所有零食中,盡可能滿足接近 27 元的情況有哪些,我們都能選擇出來,接下來我們選擇出最接近超過 9 元的情況就可以了。


代碼修改如下:


1/**
2?*?
3?*?@param?prices?各個商品的價格
4?*?@param?n?商品的個數
5?*?@param?w?滿減條件(滿?199-99元)
6?*/
7public?static?void?ShoppingSnacks(int[]?prices,int?n,int?w){
8????//將商品的價格擴展到三倍
9????boolean[][]?tree?=?new?boolean[n][3*w+1];
10????tree[0][0]?=?true;
11????tree[0][prices[0]]?=?true;
12????//動態規劃
13????for?(int?i?=?1;?i?<?n;?i++)?{
14????????//?不購買當前商品
15????????for(int?j?=?0;j?<=3*w;?j++)?{
16????????????//尋找上一個商品決策狀態
17????????????if(tree[i-1][j]?==?true)?{
18????????????????tree[i][j]?=?true;
19????????????}
20????????}
21
22????????//?購買當前商品
23????????for(int?j?=?0;j?<=3*w-prices[i];?j++)?{
24????????????//尋找上一個商品決策狀態
25????????????if(tree[i-1][j]?==?true)?{
26????????????????tree[i][j+prices[i]]?=?true;
27????????????}
28????????}
29?????}
30}
31


那么還有一個問題就是最大可能超過并接近 9 元的情況我們選擇出來了,但是怎么把選擇的哪些零食列出來呢?


我們利用倒推的方法,這個地方很難理解,可以自己嘗試著畫圖或者根據代碼和上邊畫的二維數組圖對應著選擇,多看幾遍估計就可以看會了,問題不大。


怎么個倒推法呢?假如我們最后一個商品在數組中用 n-1 表示,如果可以通過 tree[n-2][ j - prices[i]],或者 tree[i-1][j] 推到出來,那么這兩種狀態可以達到,就可以判斷當前的這個零食是否購買,如果兩種狀態都可以達到,我們選擇一種就好,以為有這樣一種情況就是,到達滿減最接近的值可能有很多中情況。


上邊介紹完了,那么給小姐姐選擇零食盡最大可能的接近滿減(199元),我們就可以享受立減 99 元的優惠了!


購物車物品如下:


我們會發現一個問題,小數不能用下標表示,那我們可以將價格以及滿減價格同時乘以10,那么就可以計算了。


代碼如下:


1/**
2?*?【動態規劃】
3?*?功能:實現天貓超市?“滿減湊單活動”
4?*?@author?小鹿
5?*
6?*/
7public?class?TBShopping?{
8
9????/**
10?????*?
11?????*?@param?prices?各個零食的價格
12?????*?@param?n?零食的個數
13?????*?@param?w?滿減條件(滿?199-99元)
14?????*/
15????public?static?void?ShoppingSnacks(int[]?prices,int?n,int?w){
16????????//將零食的價格擴展到三倍
17????????boolean[][]?tree?=?new?boolean[n][3*w+1];
18????????tree[0][0]?=?true;
19????????tree[0][prices[0]]?=?true;
20
21????????//動態規劃
22????????for?(int?i?=?1;?i?<?n;?i++)?{
23
24????????????//?不購買當前零食
25????????????for(int?j?=?0;j?<=3*w;?j++)?{
26????????????????//尋找上一個零食決策狀態
27????????????????if(tree[i-1][j]?==?true)?{
28????????????????????tree[i][j]?=?true;
29????????????????}
30????????????}
31
32????????????//?購買當前零食
33????????????for(int?j?=?0;j?<=3*w-prices[i];?j++)?{
34????????????????//尋找上一個商品決策狀態
35????????????????if(tree[i-1][j]?==?true)?{
36????????????????????tree[i][j+prices[i]]?=?true;
37????????????????}
38????????????}
39????????}
40
41????????//找出需要湊單的零食
42????????int?j;
43????????for(j?=?w;j?<?3*w+1;?j++)?{
44????????????//在最后一個零食尋找滿足最接近?200?的條件狀態
45????????????if(tree[n-1][j]==true)?{?
46????????????????System.out.println("滿減的最大條件為"+(float)j/10+"元");
47????????????????break;
48????????????}
49????????}
50
51????????//沒有可選擇零食
52????????if(j?==?-1)?{
53????????????return;
54????????}
55
56????????//?倒推遍歷滿足條件的零食
57????????for(int?i?=?n-1;?i>
=1;?i--)?{
58????????????//當前賬單的總金額大必須于當前零食金額
59????????????//且上一個商品的決策狀態為?true
60????????????if(j?-?prices[i]>=0?&&?tree[i-1][j-prices[i]]?==?true)?{
61????????????????//已購買該零食
62????????????????System.out.println(Snacks[i]+p[i]);
63????????????????j?=?j?-?prices[i];
64????????????}else?{
65????????????????//沒有購買該零食
66
67????????????}
68????????}
69????????if(j?!=?0)?{
70????????????System.out.print(Snacks[1]+p[0]);
71????????}
72????}
73}


運行結果:


當你給小姐姐完成了這項艱巨的選擇之后,小姐姐的態度就180 度大轉彎了!



也許,你脫單的日子到了,脫單了別忘了回來小鹿點個好看轉發朋友圈,讓你身邊更多的宅男們脫單。


源碼獲取方式】:公眾號回復“撩妹源碼”,即可免費獲取小鹿精心整理“滿減湊單”的全部源碼。


「一個不甘平凡的碼農」一直專注于原創輸出。

長按識別二維碼關注

小鹿公眾號專注于「前端」、「數據結構」互聯網技術領域,通俗簡單的文字和動漫配圖,讓你愛上編程。


?掃描上方二維碼關注小詹

總結

以上是生活随笔為你收集整理的【实战篇】| 小鹿教你用动态规划撩妹的正确方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。