貪心 01揹包 能量石 01揹包 貪心

2021-10-10 18:40:42 字數 2109 閱讀 9342

相關:

調整法證明貪心問題:

734. 能量石

參考題解:

辰風:能量石十分清晰!!!!

重點:貪心證明、01 揹包、思維、google kickstart2019 round b problem b

貪心證明:

狀態計算:

當然,空間優化為 1 維也是完全ok的。

引自辰風:能量石十分清晰!!!!

利用貪心來對所有的能量石排序,這樣問題就變成了按照乙個線性順序取對每乙個能量石判斷是否拿取的問題了,就變成了經典的01揹包問題還有乙個是總時間 m的取值問題,因為我們狀態定義的是前i個能量石中取,經過了恰好 j 時刻的解,所以只要找出 j 最大可能是多少就可以了,就是所有能量石時間總和

令f[i][j]為從前i個能量石中取,經過了恰好 j 時刻的解

狀態轉移方程 f[i][j] = max(f[i][j], f[i - 1][j - s] + max(0, e - l * (j - s)));

解釋一下裡面的細節:首先吃第i個能量石的時刻已經過了 j-s 的時間了,因為能力石的能力不為負數,所以和0取乙個max

由於我們不知道剛好進過哪乙個時刻是解最大的時候 ,所以對每乙個時間遍歷,找出最大值

引自麻煩寫注釋大佬!!!首先,此題想到 01 揹包應該是不難的,因為這題無非就是對每一塊石頭進行選與不選的抉擇。但光光進行這一步,答案顯然是錯誤的,因為選到後面,可能會導致他們現有的能量變成 0。前面所選的石頭如果需要花費越長的時間吃,則後面石頭所剩餘的能量就越少,我們如果不進行貪心,則會造成前面的決策真的只是成了乙個區域性最優解,並且利用這個區域性最優解,你無法構造出全域性最優解。

為此我們需要利用貪心來縮小我們的決策範圍。

這裡要弄清楚 01 揹包是解決了個什麼問題:它是列舉了所有選法,並在其中找到了最大值。所以對於排序之後第乙個能量石,我們會把所有吃它的方案,和不吃它的方案全部列舉到。

理解了hh

**:

#include

#include

#include

using

namespace std;

const

int n =

105, m =

25005

;int n;

int a[n]

;int f[m]

;int

main()

cout << res << endl;

}return0;

}

2020/11/24

針對體積,選恰好這塊,還是不能太理解。可能一開始做揹包問題都是最大不超過j。自己也沒舉一反三的能力,在做買書潛水員問題時初次接觸到體積恰好體積至少、這樣的定義,也做了詳細總結。但還是感到很彆扭…在揹包問題求方案數時,體積也為恰好,本題也是。在我的理解下,狀態定義不同,初始化方式不同,最後返回結果需要遍歷求最大值等等…目前能夠理解本題,但還是摳不出來裡面的更多細節。二刷回顧的時候,後續這類狀態定義方式會很注意!!!加入疑問

飯卡 01揹包 貪心

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功 即使購買後卡上餘額為負 否則無法購買 即使金額足夠 所以大家都希望盡量使卡上的餘額最少。某天,食堂中有n種菜 每種菜可購買一次。已知每種菜的 以及卡上的餘額,問最少...

01揹包問題 貪心 DP

在8月18號參加了華為的優招機試,三道程式設計題,前兩道難度不算很大,第一題很簡單,第二題是經典的 揹包問題,小偷偷東西,順著這個機會也總結一下這個01揹包問題,對於題目的描述一開始是憑記憶寫的,後來在牛客網上看到了這個面試的題目,應該是對的,不過有小的區別也不影響題目的分析和程式設計實現。這題目是...

貪心法解決0 1揹包問題

貪心法是指 在揹包沒有裝滿之前,只要能裝得下就裝進揹包.在使用貪心法解決0 1揹包問題主要在於分解方案和貪心選擇方案.貪心法不能保證最優解 為了盡可能的得到最優解,選擇物品時,總是選擇v i w i 最大的物品裝進去 所以在程式的開始,應首先對物品按照v i w i 從大到小進行排序,因此在排序的過...