01揹包問題 ACMer入門暑假集訓1

2021-10-08 12:53:56 字數 2304 閱讀 9858

相信dd的揹包九講已經講的很詳細了,不過我帶來了更適合入門者學習的模板,開始吧

描述:n件物品,容量為v,第i件物品的重量為w[i],價值為v[i],求怎麼裝可以使揹包裝的價值之和最大

理解:每件物品只能拿一次,每件物品可以選擇拿或不拿,所以我們從前i件物品開始考慮拿或者不拿;

拿第i件物品:揹包總價值就是第i件價值加上前i-1價值的總和;用表示式表示的話就是總價值=v[i]+前i-1的價值總和

這裡我們設f[i][j]表示前i件物品放在容量為j的最大價值

不拿第i件物品:揹包的總價值就很簡單計算了,就直接是前i-1件物品的總價值了

f[i][j]=max(f[i−1][j],f[i−1][j−w[i]]+v[i])

相信這個不用詳細解釋了,上面解釋的蠻清楚的

**二維陣列一般不用哈哈哈哈,時間和空間複雜度較大,不過有挺多優化的方法,就是把二維陣列變成一維陣列,那時間複雜度就變成了0(n)了

先把f[i][j]改為一維陣列f[j],那麼f[i][j]=max(f[i−1][j],f[i−1][j−w[i]]+v[i])這個關鍵ac**將如何變吶?

請看下面講述。

上面的描述萬一你看不懂其實對你做01揹包問題不是特別大;不過最好還是得理解,實在不行就記住模板吧;以後寫多就慢慢的理解了

​for

(int i =

1; i <= n; i++

)for

(int j = v; j >=

0; j--

) f[j]

=max

(f[j]

, f[j - w[i]

]+ v[i]

);

這個就是01揹包的關鍵**,超級有用!!!

因為每次拿與不拿有乙個關鍵因素就是當前拿的物品是否超過當前揹包剩餘的容量,所以在迴圈部分可以繼續改進

​for

(int i =

1; i <= n; i++

)for

(int j = v; j >= w[i]

; j--

) f[j]

=max

(f[j]

, f[j - w[i]

]+ v[i]

);

上面就是我們a題的關鍵**,好了學習上面的這些就可以去a 01揹包問題了

其實這個**還可以繼續優化,不過在這裡對於新手就足夠了,想繼續深入了解,上度娘或者看dd的揹包九講哈哈哈哈

洛谷2925

題目描述

農民john面臨乙個很可怕的事實,因為防範失措他儲存的所有稻草給澳大利亞蟑螂吃光了,他將面臨沒有稻草餵養奶牛的局面。在奶牛斷糧之前,john拉著他的馬車到農民don的農場中買一些稻草給奶牛過冬。已知john的馬車可以裝的下c(1 <= c <=50,000)立方的稻草。

農民don有h(1 <= h <= 5,000)捆體積不同的稻草可供購買,每一捆稻草有它自己的體積(1 <= v_i <= c)。面對這些稻草john認真的計算如何充分利用馬車的空間購買盡量多的稻草給他的奶牛過冬。

現在給定馬車的最大容積c和每一捆稻草的體積vi,john如何在不超過馬車最大容積的情況下買到最大體積的稻草?他不可以把一捆稻草分開來買。

輸入輸出格式

輸入格式:

第一行兩個整數,分別為c和h

第2…h+1行:每一行乙個整數代表第i捆稻草的體積vi

輸出格式:

乙個整數,為john能買到的稻草的體積

輸入輸出樣例

輸入樣例#1:

7 3265

輸出樣例#1:

7ac**

#include

using

namespace std;

int f[

111111];

intmain()

//優化,如果已經達到最好的結果(裝滿),就直接退掉

}printf

("%d"

,f[m]);

}

這也就是我這週學習的到的其中的乙個簡單的演算法,之後完全揹包問題等,dp入門還沒學會哎

DP入門, 0 1揹包問題

hloj 1006 0 1揹包問題 hdu 2602 bone collector類似,但要注意輸入順序,問題規模,最重要的是重量為0的骨頭居然也有價值的!includeusing namespace std define n 401 define m 1501 int f n m 下標從1開始用 ...

01揹包入門

01揹包問題模型 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方...

01揹包入門

description 乙個旅行者有乙個最多能裝m公斤的揹包,現有n件物品,它們的重量分別是w1,w2,w3,wn,它們的價值分別為c1,c2,c3,cn。若每種物品只有一件,求旅行者能獲得的最大總價值。input m,和n m 200,n 30 接下來共n行每行兩個整數wi,ci output 最...