我們已經在貪婪演算法教程的上一篇文章中討論了分數階揹包問題。在這篇文章中,我們將討論另乙個著名的問題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...