01揹包的回顧

2021-06-06 19:35:10 字數 683 閱讀 7781

01揹包:

n 件物品,如何選擇才能在揹包容量為 v 的情況下做出最好的?

設物品序號為從 1 到 n,體積和價值分別為:c[i] 、 v[i]

則可畫出決策樹:

寫出狀態方程:

f(v, n) = max

如此,則可輕易用遞迴寫出 o(2^n) 的**,在此不寫了。

但如何優化呢?

考慮到,遞迴時不論如何呼叫,引數總在 v * n 的乙個表中:

而將會要呼叫 2^n 那麼多次,那麼就很可能有許多呼叫是重複以前已經計算過的工作

(呃,這個地方如果 v 比較大,那就有可能沒有重複呼叫……但那樣的話估計沒人會用這個來做,直接放就行了……)

所以,可以用乙個初始化為 -1 (或者其他)的 ans[n][v] 的二維陣列存放對應的結果,即:

ans[n][v] = f(n, v);

在每次呼叫函式的時候檢測該陣列對應元素是否已改變過(即該次呼叫是否是重複以前的工作),改變了,則直接返回對應元素,未改變則計算答案並儲存到對應元素中。

優化之後複雜度為:o(n*v)。

回顧基本01揹包問題

今天練了一下當年的揹包問題,發現居然oj還沒過,趕緊刷一下。想到當年,每次做揹包,就和軍爺一起回憶 eason的你的揹包,從此變得好浪漫 題目太經典了,分析就略過了。寫個遞推方程 c i,j max if bagweight j w i c i,j 1 if j bagweight 遞推出口尚且如此...

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...

揹包專題 01揹包

暑假集訓開始了,按照隊裡的分配,我是弄dp的,嘛,於是我又一次的開始了從01揹包開始學習,昨天將杭電的幾道01揹包重新做了一遍,下面講講我自己對於01揹包的理解。首先01揹包題目的雛形是 有n件物品和乙個容量為v的揹包。第i件物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。...