0 1揹包問題

2021-10-22 05:58:34 字數 3342 閱讀 4074

我們已經在貪婪演算法教程的上一篇文章中討論了分數階揹包問題。在這篇文章中,我們將討論另乙個著名的問題0-1揹包問題

0-1揹包問題類似於分數揹包問題,該問題陳述說,我們基本上得到了一組具有權重和值的專案。我們還給了乙個具有一定容量的揹包,揹包不能儲存超出其容量的東西。

我們的目標是收集揹包中的最大值。

注意在這裡我們不能部分收集物品我們只有兩種選擇,是完全揀選還是保留物品。這就是為什麼將此問題稱為「 0-1揹包問題」的原因,您可以選擇還是不選擇。

考慮乙個包含硬幣的揹包的例子,我們不能將硬幣部分或分開,要麼我們必須拿硬幣,要麼將其丟下。

我希望問題陳述對您來說很清楚。目錄

讓我們通過舉例更清楚地了解問題陳述。

0-1揹包問題

在上面的示例中,最佳解決方案是採用第2項和第4項,輸出為90。請

注意,在這裡,我們只有兩個選擇,要麼是選擇專案,要麼是離開專案。

我們知道只有兩個選擇,並且必須在揹包容量內收集揹包中的最大可能值,因此我們將使用遞迴來解決此問題。我們將從後面進行遞迴。

此問題類似於查詢字串的所有可能子串行的問題。

讓我們看一下0-1揹包問題的遞迴**

package knapsack;

class knapsackrecursion

else

} public static void main(string args) throws exception ;

int wt = ;

int w = 10;

int n = wt.length;

system.out.println(knapsack(wt, val, w, n));

}}

讓我們清楚地了解**,最初我們具有weight ,value ,容量和n(專案數)。

顯然,如果(商品的重量》容量),我們將不考慮該商品,因為它違反了我們的容量限制。

現在,我們已經知道只有兩種情況可能,因此我們將考慮這兩種情況–

(i)在第一種情況下,我們將不考慮第n個專案,因此我們將對其餘(n-1)個呼叫遞迴專案。

(ii)在第二種情況下,我們將考慮第n個專案。因此,經過考慮,容量將減少至(容量-該項目的重量),我們還將其總價值累加到結果中。

我們將通過更新其他引數再次呼叫對其餘(n-1)個專案的遞迴。

遞迴解的時間複雜度:o(2 ^ n)

讓我們通過考慮上面的示例來理解這種遞迴,

0-1揹包問題

現在,為上面的示例執行遞迴,

我希望很清楚遞迴是如何進行的。

我們可以觀察到在上面的遞迴中有乙個重疊的子問題,我們將使用動態程式設計來克服它。

隨著遞迴的進行,我們發現存在重疊的子問題,一次又一次地解決相同的子問題是沒有意義的。

現在讓我們看一下dp**,

package knapsack;

class knapsackmemoization

else

return dp[n][capacity];

} public static void main(string args) throws exception ;

int wt = ;

int w = 10;

int n = wt.length;

system.out.println(knapsack(wt, val, w, n));

}}

這是乙個基於記憶的解決方案(自上而下)。它與遞迴解決方案相似,唯一的區別是我們將子問題的解決方案儲存在某個陣列或哈希圖中,以便每當我們再次需要該子問題的解決方案時,都可以使用此資料,而無需再次計算。

自上而下解決方案的時間複雜度:o(n.capacity)

此解決方案類似於自上而下的解決方案,唯一的區別是,我們以自下而上的方式填充陣列,這意味著我們首先考慮可用的項來填充陣列,然後考慮我們只有兩個專案可用,這樣我們就填充了整個二維陣列。

讓我們看一下**,

package knapsack;

class knapsacktabulation

}} return dp[n][capacity];

} public static void main(string args) throws exception ;

int wt = ;

int w = 10;

int n = wt.length;

system.out.println(knapsack(wt, val, w, n));

}}

讓我們更清楚地了解**,我們建立了乙個大小為[n + 1] [capacity + 1]的dp 2d陣列,乙個額外的空間用於儲存基本條件,然後,我們執行了與我們遵循基於記憶的方法。

讓我們通過乙個例子來理解它,

0-1揹包問題

我們將為上面的示例製作一張**,

0-1揹包問題

在此,行表示專案,列表示容量。

讓我們更清楚地了解該錶,

dp [1] [5]表示通過考慮第乙個專案,最大可以通過容量為5的揹包獲得多少價值

。dp [3] [7]表示通過考慮第乙個專案3個專案,最多可以通過乙個容量為7的揹包獲得多少價值。

我們將通過遵循自下而上的動態規劃演算法來獲得上述問題的答案。

時間複雜度:o(n.capacity)

我希望這個問題陳述(0-1揹包問題)及其dp解決方案對大家都清楚。

這就是所有的民俗.. !!!

在這裡嘗試一些滑動窗**術問題

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...