小明系列故事 買年貨(HDU)

2021-09-10 02:22:49 字數 1123 閱讀 6093

題意理解

有n個可以買的年貨,每個年貨有單價,抵扣的積分和實際的價值,小明手裡有v1的錢,v2的積分,可免費的年貨數量k。問如何買才能使年貨總的價值最大?

問題分析

多維01揹包問題,用dp。

動態規劃要找狀態,然後找狀態轉移方程。對於本題,狀態是dp[ii][jj][kk][ll],表示前ii個年貨花了jj錢,花了kk積分, 用ll免費數量後的最大價值。

轉移方程分四種**,dp[ii-1][jj][kk][ll]前ii-1個年貨花了jj錢,kk積分,ll免費數量的最大價值;

dp[ii-1][jj-p[ii]][kk][ll] +v[ii] 前ii-1個年貨花了jj-p[ii]錢,kk積分,ll免費數量的最大價值,加上第ii個年貨的價值;

dp[ii-1][jj][kk-b[ii][ll] + v[ii] 前ii-1個年貨花了jj錢,kk-b[ii]積分,ll免費數量的最大價值,加上第ii個年貨的價值;

dp[ii-1][jj][kk][ll-1] +v[ii]前ii-1個年貨花了jj錢,kk積分,ll-1個免費數量的最大價值,加上第ii個年貨的價值。

取這四個**的最大值就是當前的狀態的最大值。

前ii狀態的最大價值只和ii-1狀態的最大價值有關,可以用同乙個儲存空間儲存前ii-1的最大價值和前ii的最大價值。這樣轉移方程就變成了

dp[jj][kk][ll] = max(dp[jj][kk][ll], dp[jj-p[ii]][kk][ll] + v[ii], dp[jj][kk-b[ii][ll] + v[ii], dp[jj][kk][ll-1] + v[ii])

實際程式,需要四重迴圈,四重迴圈分別表示對於每前ii個年貨,不同錢,不同積分,不同免費數量下的最大價值。每重迴圈的開始結束條件分別是ii:[1,n], jj:[0,v1], kk:[0,v2], ll:[0,k],  轉移方程可以變成三維,但是時間複雜還是n^4。

其他揹包問題是dp的典型應用,要點是找狀態,找狀態轉移方程;

其次,實現dp的演算法,需要理解不管優化前優化後,所儲存的動態規劃值都是累積值,這個累計值是將n個物品排個序,分成前乙個物品的最大價值,前兩個物品的最大價值,。。。,前n個物品的最大價值;還要理解對體積,重量,總錢數的限定,影響到迴圈的初始值是0,還是當前物品的對應的體積,重量,或是單價。

鏈結

HDU 4501 小明系列故事 買年貨

解題思路 三維揹包,設定dp i j k 代表有i塊錢,有j個積分和k個免費物品的時候,可以得到的最大價值。則對於當前物品,我有兩種選擇 第一種 不買 第二種 買 如果選擇買又分了三種情況,1.用錢買。dp i 錢 j k 價值 2.用積分買。dp i j 積分 k 價值 3.免費拿。dp i j ...

HDU 4528 小明系列故事 捉迷藏

小明的媽媽生了三個孩子,老大叫大明,老二叫二明,老三.老三自然就叫小明了。一天,小明的媽媽帶小明兄弟三人去公園玩耍,公園裡面樹木很多,有很多地方可以藏身,於是他們決定玩捉迷藏。經過幾輪的猜拳後,第一輪是小明來找其他兩個人,遊戲規則很簡單 只要小明可以在規定的時間內找到他們就算小明獲勝,並且被發現的兩...

hdu 4528小明系列故事 捉迷藏 (bfs)

題意 就是三個傻明玩捉迷藏,小明負責找大的和二的,直線可以看見就算找到,人擋著人都不行!問小明可不可以在規定時間完成任務。思路 就是正常的bfs,只不過有些細節處理需要注意,比如能否看到大明二明,保證兩點中間都是 還有就是去重,這裡需要注意,小明是可以走回頭路的,比如大明在左上,二明在右上,小明就要...