01揹包的學習

2021-07-09 21:57:24 字數 754 閱讀 3472

問題描述:

有 n 個重量和價值分別為 w[i],  v[i] 的物品。從這些物品中挑選出總重量不超過 w 的物品, 所求有挑選方案中價值中價值總和的最大值。

(限制條件:1 <= n <= 100, 1 <= w[i], v[i] <= 100, 1 <= w <= 10000)

輸入:4 5  (n, w)

2 3  (w[i],  v[i])

1 23 4

2 2輸出:

7每一件物品有兩種結果:放入或是不放入揹包。於是可以用搜尋來解決。

但是這樣會產生高度為 n 這樣大的遞迴樹,在限制的時間內會無法完成。看一下這樣產生的樹:

這樣的搜尋會有重複呼叫,造成時間和空間上的浪費。

對於這種情況,可以採用動態規劃的方式解決。(動態規劃:把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解)

從第i個物品開始挑選總重小於j時,總價值的最大值,其遞推式:

dp[n][j] = 0;

j < w[i] :

dp[i][j] = dp[i+1][j]

其他:dp[i][j] = max( dp[ i+1 ][j] ,  dp[ i+1 ][ j-w[i] ] + v[i]

void fun()

}printf("%d\n", dp[0][w]);

}

揹包 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 求解將哪些物品裝入揹包可使價值總和最大。...

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...