一維dp陣列01揹包

2022-06-20 09:06:14 字數 1030 閱讀 5891

有n件物品和乙個最多能被重量為w 的揹包。第i件物品的重量是weight[i],得到的價值是value[i] 。每件物品只能用一次,求解將哪些物品裝入揹包裡物品價值總和最大。

這是標準的揹包問題,以至於很多同學看了這個自然就會想到揹包,

甚至都不知道暴力的解法應該怎麼解了。

這樣其實是沒有從底向上去思考,而是習慣性想到了揹包,

那麼暴力的解法應該是怎麼樣的呢?

每一件物品其實只有兩個狀態,取或者不取,所以可以使用回溯法搜尋出所有的情況,

那麼時間複雜度就是o(2^n),這裡的n表示物品數量。

所以暴力的解法是指數級別的時間複雜度。進而才需要動態規劃的解法來進行優化!

舉乙個例子:

揹包最大重量為4。

物品為:

重量 價值

物品0 1 15

物品1 3 20

物品2 4 30

問揹包能背的物品最大價值是多少?

二維dp陣列揹包已經說過了,遞推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

其實可以發現如果把dp[i - 1]那一層拷貝到dp[i]上,表示式完全可以是:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);

於其把dp[i - 1]這一層拷貝到dp[i]上,不如只用乙個一維陣列了,只用dp[j](一維陣列,也可以理解是乙個滾動陣列)。

這就是滾動陣列的由來,需要滿足的條件是上一層可以重複利用,直接拷貝到當前層。

public void test_1_wei_bag_problem() ;

int value = ;

int bagweight = 4;

// 初始化

int dp = new int[bagweight +1];

for(int i = 0; i < weight.length; i++)

}}

01揹包一維dp陣列的實現

二維的01揹包模板 include include include using namespace std const int maxw 10000 const int maxn 100 int n,w int w maxw 2 v maxn 2 dp maxn 2 maxw 2 int main ...

0 1揹包使用一維陣列

使用滾動陣列將空間優化到了2 v,在揹包九講中提到了使用一維陣列也可以達到同樣的效果,個人認為這也是滾動思想的一種,由於使用一維陣列解01揹包會被多次用到,完全揹包的一種優化實現方式也是使用一維陣列,所以我們有必要理解這種方法。如果只使用一維陣列f 0 v 我們要達到的效果是 第i次迴圈結束後f v...

小梁的揹包(01揹包 一維陣列)

時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 題目描述 小梁來到了伽勒爾地區並參加了聯盟賽熱身賽,比賽小島上有n個精靈散落在島上各處,她有乙個大小為s的揹包,每個精靈的戰鬥值為vi 體積為wi 請問在她臨走之前...