動態規劃初探 揹包問題

2022-06-03 01:33:09 字數 2246 閱讀 2427

在為期乙個星期的acm集訓之後,我就這樣做了乙個逃兵hhhh

在這乙個星期裡面,學長講了快速排序,二分三分搜尋,矩陣快速冪,線段樹,bfs(廣度優先搜尋)和dfs(深度優先搜尋),鄰接表和雜湊表,結構體和優先佇列,揹包問題和動態規劃。

其中講快速排序那天我還在考試,就沒有去聽,第二天找學長的時候也聽得似懂非懂。

學長講矩陣快速冪的時候爸媽來找我,也沒有聽。其中基本都學的不紮實。

所以都要後期重新再學一遍,鞏固紮實。估計學長還會講並查集和最小生成樹,我就自己看看書吧~

以上就是背景,下面今天我重新看了看動態規劃。動態規劃的入門基本逃不出 01揹包問題。

可能這是乙個基本的必經問題:

有乙個包和n個物品,包的容量為m,每個物品都有各自的體積和價值,問當從這n個物品中選擇多個物品放在包裡而物品體積總數不超過包的容量m時,能夠得到的最大價值是多少?

這個問題,學長當時給了幾個例子:有三個揹包,分別重3,3,5.他們的價值分別是6,6,9.揹包的最大的載重量為10.問該怎麼選擇揹包。

我因為比較貪婪,肯定選擇價值大的,先選擇9。其實這就體現了貪心演算法,先只顧眼前的利益。

但是學長說,有些人會先看價值利益的量,比如前兩個的揹包的價值量是2,第三個揹包的價值量是9/5。明顯人們應該喜歡小而精美的物品,應該選擇前兩個的才能更能拿到有價值的東西。

我頓時想想覺得非常有道理。但是如果你仔細想想,如果我選擇了前兩個,他們的總價值為12,但是他們的總質量是6,不能把第三個物品再裝到包裡,這就造成了包的浪費。

而如果我選擇重量分別為3,5的物品,我的價值總共能夠拿到6+9= 15 的物品!

所以我們在選物品的時候要多次比較,一直選一種方案比較到底,然後再進行下一條方案,這裡就要用到dfs。

比如選了物品a,然後選擇物品b,或者選擇物品c。然後選擇物品b的接著選擇物品c,而選擇物品c的選擇物品b。

有點累死二叉樹的感覺,但是子節點要比二叉樹多。二叉樹的基礎題可以做一下我們學校的oj裡面的乙個基礎題:數字三角形

這道題目我剛開始做得時候其實用了動態規劃,但是當時我還是不懂動態規劃的思想。

這道題目當時的**:

#include int main()

int num[255][255]={};

int output[255][255]={};

for(int i=1;i<=n;i++)

}for(int i=1;i<=n;i++)

for(int i=n-1;i>=1;i--)

else}}

printf("%d\n",output[1][1]);}}

這個是練手,其實就是從最上面開始看起,先比較下面兩個,選擇比較大的那乙個。這就用到了貪心演算法的思想。

咳咳,好像有點跑題了,繼續回到揹包問題。

用我們學長的話來概括好了:

當我們在考慮第i個物品的時候,實際上我們只需要關心前i-1個物品能組合出什麼樣的體積,我們並不關心每一種組合到底是什麼樣的。 因為組合數量實在太多了,我們需要抓住這些組合的「共性」。從來抽象出可以承受的狀態數

*/昨天在杭電的bestcoder來了一發,只能怪自己基礎薄弱,只做出第一題,第二題就因為自己考慮非常多就卡住了,然後在那邊寫了乙個多小時還沒有寫出來。

但正是因為想得非常多,到hack時間的時候就hack掉了乙個人,第一次hack成功哈哈

第一次參加bestcoder名字就這麼順利地變綠了^_^而且接近變藍。我要繼續努力,早日變藍

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...

動態規劃 揹包問題

1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...