完全揹包詳解(最優方法)

2021-07-16 20:03:34 字數 2594 閱讀 5446

4、o(vn)的演算法

偽**

[cpp]view plain

copy

for (int i = 1;i <= n;i++)  

}  分析:這和01揹包的偽**很相似,在01揹包的**中,v變化的區間是逆序迴圈的,即[v,weight[i]]。而這裡,v變化的區間是順序迴圈的,即為[weight[i],v]。

原因:再次給出定義:

f[i][v]表示把前i件物品放入容量為v的揹包時的最大代價。

f[i-1][v-c[i]]表示

把前i - 1件物品放入容量為v的揹包時的最大代價.

在01揹包中,

v變化的區間是逆序迴圈的原因

:要保證

由狀態f[i-1][v-c[i]]遞推狀態

f[i][v]時,

f[i-1

][v-c[i]]沒有放入第i件物品

。之後,在第i迴圈時,放入一件第i件物品。

01揹包的方程:

[cpp]view plain

copy

f[i][v] = max(f[i - 1][v],f[i - 1][v - weight[i]] + value[i])    

在完全揹包中,

v變化的區間是順序迴圈的原因

:完全揹包的特點是每種物品可選無限件,在求解

加選第i種物品帶來的收益f[i][v]時,在狀態

f[i

][v-c[i]]中已經盡可能多的放入物品i了,此時在

f[i][v-c[i]]的基礎上,我們可以再次放入一件物品i,此時也是在不超過揹包容量的基礎下,盡可能多的放入物品i。

完全揹包的方程:

[cpp]view plain

copy

f[i][v] = max(f[i - 1][v],f[i][v - weight[i]] + value[i]);  

舉例:物品個數n = 3,揹包總容量為v = 5。

物品資訊:

完全揹包:

分析:i = 2,表示正在處理第2件物品。在求解f[2][4]時,如果要計算把第2件物品放入揹包後的代價時,我們需要知道f[2][2],此時f[2][2]中已經盡全力放入第2件物品了(已經放入一件)。此時此刻還可以在放入一件第2件物品,在揹包容量為4時,最多可以放入兩件第二件物品。

總結下,f[i][v]:表示在揹包容量為v時,盡全力的放入第i件物品的代價。f[i][v - weight[i]]:表示在揹包容量為v - weight[i]時,盡全力的放入第i件物品的代價。因此由f[i][

v - weight[i]

]轉換為f[i][v]時,也是在f[i][

v - weight[i]

]的基礎上有加入了一件物品i。

為了節省儲存狀態的空間,可以直接使用一維陣列儲存狀態。

**:迭代方程:

f[i][v] = max(f[i - 1][v],f[i][v - weight[i]] + value[i]);

[cpp]view plain

copy

#include 

#include 

#include 

using

namespace std;  

const

int n = 3;  

const

int v = 5;//5

int weight[n + 1] = ;  

int value[n + 1] = ;  

int f[n + 1][v + 1] = ;  

int completeknapsack()  

for (int v = 0;v <= v;v++)  

for (int i = 1;i <= n;i++)  

}  return f[n][v];  

}  int main()    

**:迭代方程:

f[v] = max(f[v],f[v - weight[i]] + value[i]);

[cpp]view plain

copy

#include 

using

namespace std;  

const

int n = 3;  

const

int v = 5;//5

int weight[n + 1] = ;  

int value[n + 1] = ;  

int f[v + 1] = ;  

int completeknapsack()  

}  return f[v];  

}  int main()    

完全揹包詳解

背景 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。我們注意看紅字部分,完全揹包與01揹包的不同之處在於每件物品有無限個,故而對於完全揹包策略要從 選與不選轉變為 選幾件 0...

完全揹包詳解

揹包問題是動態規劃裡面很重要的一部分,徹底理解各種揹包問題,對動態規劃的後續學習有很大的幫助.更全的揹包問題,可參看 揹包九講 學會了0 1揹包後,多重揹包 完全揹包就比較容易理解.一.什麼是 完全揹包 有這樣乙個問題 在你面前放著n種寶石,每種寶石重量為wi,價值為vi,數量無限 你有乙個最多可以...

九大揹包問題專題 完全揹包問題(詳解,最優解)

和01揹包問題的區別 01揹包問題 1件物品只能選或者不選 完全揹包問題 1件物品可以重複選多次,只要不超過總體積 題目 問題 有n件物品和乙個容量是v的揹包。第i件物品的體積是vi,價值是wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包的容量,且價值最大。輸入格式 第一行有兩個整數,n...