揹包九講學習筆記(2)

2021-08-08 15:12:57 字數 1650 閱讀 1782

寫在前面

一方面學習揹包九講:>,這個十分清晰,重點標記清楚。

但有些需要自己理解的和重點的,我做了如下筆記,方便別人理解,也方便自己複習,如有錯誤,歡迎指正。

題目特點

1. n種物品v容量,每種物品費用c

[i],價值w

[i] 2. 每種物品無限件

3. 要求: 費用和不超過揹包容量且價值總和最小

簡單思路

基本思路

從每件物品的角度考慮,與它相關的策略變成取k件 (0<=i<=v/c[i]) ,所以策略轉移方程如下:

f[i][v]=max
時間複雜度: 跟01揹包問題一樣有o(nv) 個狀態,但是求解每個狀態不是常數,而是o(v/c[i]),總的複雜度是超過o(vn)

簡單有效的優化

1. 優化方案:

-首先去除費用大於v的物品,然後採用類似計數排序的演算法,計算出相同費用中是哪個。(時間複雜度:o(v+n))

-若兩件物品i,j滿足c[i] <= c[j] 且 w[i] = w[j], 則將物品j去掉(至少不會差思路)

2. 優化效果:

-對於隨機資料,往往大大減少物品的件數,加快速度

-最壞情況,可能一件物品都去不掉。

3. 時間複雜度: (o(n^2))

轉化成01揹包問題
1. 轉換思路:

-由於第i件物品最多選v/c[i]件,於是可以把第i種物品轉化為v/c[i]件費用及價值均不變,然後求解這個問題。

2. 時間複雜度:

-沒有改變基本思路的時間複雜度

更高效的轉化思路

奇怪的優化方案: (我在看這部分時,理解了半天,最終覺得這樣的理解不太對,比如第i件選3件時,並不能是2^k件,雖然偽**和這也並不相關。)

將第i種物品轉化為費用為c[i]*2^k

、價值為w[i]*2^k

的若干件物品。這是二進位制的思想,因為不管最優策略選幾件第i種物品,

總可以表示成若干個2^k

件物品的和。

2. 由基本思路轉化:

1. 偽**:

for i=1:n

for v=0:v

f[v] = max

2. **解釋

這個偽**與01揹包的偽**的區別只有v的迴圈次序不同而已,那麼我們分析下這兩種順序作用

- 逆序(01揹包):保證f[i][v]是由f[i][v]遞推而來,保證了每件物品只選擇一次

- 順序 :相當於f[i][v] = max,即f[v-c[i]]有可能被修改過了,

那麼代表第i件物品被選擇了至少一次,f[v-c[i]]就代表著在此基礎上在增加一件(類似基本思路中,依次增大k)

3. 完全揹包抽象

/***@param cost 第i件物品的費用

*@param weight 第i件物品的價值

*/procedure completepack(cost,weight)

for v = cost :v

f[v] = max

總結
- 學習揹包問題,需要自己深入思考其中的含義,一步步的自己動手寫,只有這樣才能深入理解大神的跳躍的思路

揹包問題(揹包九講) 學習筆記

學習了dd大佬的揹包九講之後,個人的一些學習筆記以及一些看法。dp i j 表示前i個物品,容量為j的時候,最大的價值 思路 將前i件物品放入容量為v的揹包中求最大價值這個問題,若只考慮第i件物品的策略 放或不放 那麼問題就可以轉換成涉及前i 1的物品的問題。此時有兩種情況,1 不放第i件物品,那麼...

揹包九講 學習筆記(一)

本文是針對揹包九講2.0的學習筆記。給定n個物體和乙個揹包,物品i的重量是wi,價值vi,揹包容量為c,物品只能選擇不裝或裝入揹包,問如何選擇裝入揹包的物品,使裝入揹包中的物品的總價值最大?輸入 c 0,wi 0,vi 0,1 i n 輸出 x 1,x2,xn x i in 滿足 sum w i x...

《揹包9講》學習

0 1揹包 題目描述見 beibao 01揹包.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std const int nn 1010 int v nn w nn int f nn nn int main fo...