揹包那些經典的例子 上

2021-08-04 02:28:23 字數 2509 閱讀 1307

發現自己對揹包問題還是情有獨鍾的嘛, 畢竟它也算的上是我真正學到的第乙個演算法。哎,現在我還是乙個苦命掙扎的菜鳥。廢話也不多說了,下面進入正題吧,這些都是菜鳥在刷揹包題遇到的基礎問題,作為菜鳥的我就是刷這些題一步一步理解揹包的。
01揹包問題——bone collector hdu - 2602
有n件物品和乙個容量為v的揹包。第i件物品的重量是w[i],價值是v[i]。求解將哪些物品裝入揹包可使價值總和最大。
然後對比一下,發現其實就是名詞變了而已,那麼直接寫出模板來。它的狀態轉移公式為f[i][j] = max( f[i-1][j], f[i-1][j-w[i]] + v[i] )。

對於初學的來說,這個還真難理解,作為菜鳥的我也花了兩三天才真正弄懂這公式。不解的可以看看我的另一篇部落格對基礎揹包的公式理解,不過這篇是當時理解靈感來的時候寫好的,感覺沒有寫好,不懂再去翻翻大佬的部落格去吧,畢竟我也是個菜鳥╮( •́ ₃•̀ )╭

#include 

using namespace std;

const int maxn=1010;

//用結構體為了繫結每一件物品的價值與體積,直接用兩個陣列也可以。

struct pack

;//f[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。 用於狀態轉移的重要函式。

int f[maxn][maxn];

int main()

//跟據子問題定義的f[i][v]表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。

就能推出最大價值的狀態為f[n][m],理解很容易,替換一下子母i,v就行了。

cout<}

return 0;

}

這只是乙個最簡單的,為了優化空間,我們得用到一維陣列來寫**。

這個是基礎揹包模板**:

#include 

using

namespace

std;

#define maxn 1010

struct pack

a[maxn];

int f[maxn], v;

//核心的迴圈,而且通用,於是做成函式,以便直接呼叫了,說的這句話是後話, 不懂看我剛才說的那篇部落格吧。

void basepack(int cost, int weight)

int main()

好了這是最基礎的基礎揹包,下面就開始講解完全揹包吧。

完全揹包問題——piggy-bank hdu - 1114

不想浪費我的時間與部落格空間了,就直接寫輸入格式了,其他自己點開鏈結翻譯吧。

輸入:

有t個案列,錢罐的開始與最後的重量為e和f,下面有n中硬幣,可以無限取,n行是硬幣的價值與重量。

求錢罐裡最少數目的錢。

我的**直接用一維陣列了,就是個完全揹包的模板,沒怎麼去看二維的**,因為用到三個迴圈真是太麻煩了!

基礎揹包公式:f[i][j] = max( f[i-1][j], f[i-1][j-w[i]] + v[i] )。

完全揹包公式:f[i][j] = max(f[i-1][j], f[i - 1][j - k*w[i] ] + k*v[i] );

很類似吧!因為物品無限嘛,得有個k值乙個乙個取同種物品。

二維轉一維同基礎揹包的一維公式一樣

f[v] = max(f[v], f[v-cost]+weight)

數學思維看問題,不多說了,哎,真是恐怖的數學思維!

來吧看模板**吧!

#include 

using

namespace

std;

#define maxn 10010

//求最小值,則f的初始化不能為0了,而是為無窮的,當然程式裡是沒有無窮大的,就定乙個很大的數了。

#define inf 0x3f3f3f3f

struct pack

p[maxn];

int f[maxn], v;

//與上乙個基礎揹包的模板很類似,因為完全揹包每種物品無限個,於是乎是從乙個開始取該物品到k個為止,然後呢也就是用它自身的前狀態推出後乙個狀態,所以v是順迴圈的。唔我的部落格還沒有這段講解,以後補上吧。

void competepack(int cost, int weight)

int main()

//發現當容量為v的最小價值為inf呵呵呵,就不行了,inf定義為無窮大嘛,都無窮大的價值了,這不可能是最小價值的,所以是沒有成立的條件了。

if(f[v] == inf)cout

<<"this is impossible."

cout

<<"the minimum amount of money in the piggy-bank is "

<"."

0;}

哎,越到後面的揹包,我講得越簡單模糊,畢竟是入門菜鳥初學沒多久,望各位別介意哈......

揹包那些經典的例子 下

補上我的上篇講解01揹包與完全揹包,這一篇講解兩個我認為比較經典的揹包題。乙個是多重揹包題,直接套模板可以ac,乙個是多重揹包與完全揹包題,需要改變一下模板。當然只要理解了揹包的核心就能輕鬆改動模板。道可道,非常道,這個核心我還是模糊到難以講出來。簡單說一下題目 有件商品最大 不超過m,然後你有很多...

經典揹包問題 01揹包 完全揹包 多重揹包

1 for int i 0 i 2for int j w j size i j 3 f j max f j f j size i value i 1 for int i 0 i 2for int j size i j w j 3 f j max f j f j size i value i f w ...

經典的揹包問題

揹包問題i 難度級別 b 執行時間限制 1000ms 執行空間限制 51200kb 長度限制 2000000b 試題描述 有乙個揹包容積為 v 和 n 個物品,並給出每個物品有乙個體積。要求從 n 個物品中,任取若干個裝入揹包內,使揹包的剩餘空間為最小。輸入第一行兩個正整數 v 和 n,分別表示揹包...