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 轉化...