演算法 揹包學習(暫時的總結)

2021-06-28 01:26:40 字數 1059 閱讀 8742

01揹包

void zerotoone(int weight, int value)

for(int i=maxv; i>=weight; i--){

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

完全揹包

void completebag(int weight, int value)

for(int i=weight; i<=maxv; i++){

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

多重揹包

void multiplebag(int num, int weight, intvalue)

if( num*weight>=maxv ){

completebag(weight,value);

return;

intk = 1;

while( kzerotoone(weight*k,value*k);

num-= k;

k*= 2;

zerotoone(weight*num,value*num);

以上為三種最基礎的揹包,其他絕大部分都是由此演化而來

分組揹包

凡是物品間有相互關係的都可以當做分組揹包,多變

每組最多取乙個:把同一組的物品視為並列的物品,在同一層上進行揹包(hdu1712)

01揹包最優解個數(hdu2126)

用bag陣列存最優解,同時num陣列存最優解個數

01揹包第k優解(hdu2639)

用bag[v][n]更新花費v以內的前n個解

01揹包花費為負數(poj2184)

花費為負時,v-cost>v(每個v由v-cost與自身比較),所以當花費為負從小到大遍歷

花費為正時,同普通01揹包,從大到小遍歷

01揹包花費為double(poj2184)

將花費與價值對調後進行揹包,逆向思維

狀壓+01揹包(poj2923)

將所有可能的狀態進行狀壓儲存,以這些狀態為花費進行揹包,花費判斷為:v&sig==0(沒有同一件物品被重複)

學習總結(揹包)

一 知識總結 1 01揹包 01揹包特點就是每一種物品都只有一件,每件物品可以選擇放還是不放。01揹包的狀態轉移方程是f i j max,這裡f i j 表示前i件物品恰好放入乙個容量為j的揹包中,w i 是第i件物品的容量,怎麼理解這個狀態轉移方程呢,就是你在第i個物品的時候,你可以選擇放還是不放...

揹包學習 多重揹包揹包

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...

揹包學習 多重揹包揹包

有n種物品和乙個容量為v的揹包。第i種物品最多有n i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。狀態轉移方程 f i v max 此時他面臨的不是01揹包的選與不選的問題,而是從n i 裡面選多少個的問題。實現方法 1 轉化...