題意 給定 n個物品 每個物品有 p q v 必須滿足q才能買這個物品,求價值最大
兩天時間的思考,
首先要理解無後效性,動歸的乙個應用條件就是無後效性,在普通揹包裡面,是否排序它都是無後效性的,我覺得理解的時候得按照現實和**兩種理解,因為代價和價值相等,所以在dp陣列裡面是否排序,其實在決策之間是不會相互影響的,把這個階段買不買的最優情況記錄下來,然後下個階段也會有根據當前最優階段的買不買的情況,而且在這個普通01揹包過程中,買不買都會有相應的情況表示,而不會有如果你這個階段買了這個東西,導致下個階段即使代價足夠,也不能購買這個東西,如果有這種情況,那麼就說這個東西是有後效性,引用這麼一段話,後效性就是這個階段的過程演變與以後(未來)無關,不會因為未來而改變。即這個階段的最優是不會變的。這是人思維的理解,而在**上,因為這道題我看了好多好多的解答。不外乎兩種理解。逆向理解。由於01揹包其實是逆向的,所以你要先買的東西是在後面往前決定的。
原因在於,
如果你通俗的說: 這個dp過程 正好是逆向的 。 dp[c-p[i]]是dp[c]的最優子結構。
也可以理解成 前面所有的狀態前面基本上把所有決策的情況都考慮到了,而每一次迴圈都是在優化所有的情況,而當最後乙個迴圈,在**裡面最後(其實是思維中最先買的物品)確定。乙個最優解就被拼接而成。dp[c-p[i]]是dp[c]的最優子結構,從而把最優的dp[m]決定。所以動態規劃是乙個沒有後效性的,這個階段的所有最優與上乙個階段有關,但是不會改變上乙個階段的最優。最後的最優決定以後,不一定它的前一步每一步都是最優(只能說是總體最優,或者說i-1階段所有決策是對於所有決策的最優)。確定了最後一步(相當於人思維的第一步),那麼它所走的路就是最優解的子結構。那麼下午說如何排序,摘抄
分析:商品如果沒有屬性q的話就是乙個單純的01揹包,正是因為該屬性,如果再像01揹包那樣求解的話就有了後效性,因為很可能存在這種情況:
先買物品1就買不了物品2,但是如果先買物品2就可以繼續買物品1
下面我們來找一下出現這種情況的條件是什麼:
01 p1==q1 p2==q2,沒影響。
假設現在又兩件物品1和2,你手中有k塊錢,而且如果先買1的話能買2,但是先買2的話不能買1,則有:
p1 + q2 ≤ k < p2 + q1
移項得,q1 - p1 > q2 - p2
好的,如果兩件商品滿足q1 - p1 > q2 - p2,那麼一定存在乙個或多個k值滿足 p1 + q2 ≤ k < p2 + q1 ,所以我們在考慮買物品的時候一定要考慮 q減p 的值大的
比如,你有13塊錢,p1 = 5,q1 = 11,w1 = 3,p2 = 3,q2 = 8,w2 = 4
按照錯誤方式排序:
按照正確方式排序:
這東西雖然想了很多,但最後還是會忘的,因為太難以準確了。
歸納一下:如果你想要根據每步都是最優後面不會被前面影響理解,01揹包的每步最優是逆序的,從最後乙個迴圈開始最優。所以要拿差值最大的開始,就把差值最大的放最後。
二 如果你想要根據,for的正序理解,你就應該知道,每一步for其實是把所有的情況都列出來,等到最後的for一確定,前面整條路都確定了。但它不一定是前面每個階段最優的dp[m],它可能是任何乙個dp。
三 消除差值帶來的負面影響,差值影響了01揹包的正常步驟。,消除後效性。排序的目的就是為了消除差值帶來的負面影響,差值越大負面影響就越大,一開始差值少影響少)而dp,很明顯就是要盡量多的運用更新了的區間,累加起來的價值才最大。所以把更新大的放前面是對的。
三種方法,隨便一種都能理解。三種都知道就會很煩躁。(最後一種的正確性很難確定,畢竟問題太多。)
**
#include
#include
#include
#include
using
namespace
std;
const
int maxn=550;
struct node
node[maxn];
int dp[5500];
bool cmp(node a,node b)//按照 q-p 從小到大排序
int main()
return
0;}
最後我想說 我可能學了假 HDU3466 排序 揹包
題目位址 轉移剩餘的空間,當前的剩餘的容量為j,則dp j 由 dp j a i p 轉移過來。但是由於物品出現的位置不確定,所以要排個序。不理解要排序的可以用這兩組樣例試一下 2 10 1 10 10 2 9 10 2 10 2 9 10 1 10 10 正解為20 ac includeusing...
hdu 3466 排序01揹包
也是好題,帶限制的01揹包,先排序,再揹包 這題因為涉及到q,所以不能直接就01揹包了。因為如果乙個物品是5 9,乙個物品是5 6,對第乙個進行揹包的時候只有dp 9 dp 10 dp m 再對第二個進行揹包的時候,如果是普通的,應該會借用前面的dp 8 dp 7 之類的,但是現在這些值都是0,所以...
帶限制的01揹包 排序 hdu3466
如果沒有購買條件限制,這道題就是乙個01揹包。所以我們來處理限制。只 dp j a i p 最優,才能保證 dp j 最優,滿足無後效性。若想使 dp j a i p 最優,即要保證對於任意兩組值 p1,q1,v1 p2,q2,v2 假設先選擇1,若想滿足無後效性,則 j a 2 p a 1 q且 ...