研究生課程系列文章參見索引《在信科的那些課》
通過之前的分析,fk(y) 表示只允許裝前k 種物品,揹包總重不超過y 時揹包的最大價值。得到0-1揹包的遞推公式和邊界條件:
對空間的優化主要在fk(y),原本我們用兩個迴圈實現:
for(int k=1;k<=n;k++)
else
}}
實際並一定不需要f[n][b]的空間,如果內層迴圈以b...0遞推,即下面的形式:
for(int k=1;k<=n;k++);
} }
因為是以b...0倒序遞推,則f[y]此時就是f[k-1][y]的值,而f[y-w]還未改變,仍為f[k-1][y-w]的值。因此可以用一維陣列儲存原來的優化函式資訊。**如下:
void zeroonepack(int f,int tagi,int v, int w,int k)
}}
再看完全揹包問題,即每個物品有無限件,不限每個物品裝入的個數。得到遞推關係和邊界條件:
遞迴公式最主要的區別是fk(y-wk)+vk,而非原來的fk-1(y-wk)+vk,即物品可以在前k件中繼續挑選。用一維陣列時希望此時f[y]的數值即為f[k-1][y]的數值,而f[y-w]的數值為改變之後的f[k-1][y-w]的數值。因此我們可以用順序0...b(而非逆序b...0)實現:
for(int k=1;k<=n;k++);
} }
具體**如下:
void completepack(int f,int tagi,int v, int w,int k)
}}
前面是0-1揹包和完全揹包的內層迴圈,還需要乙個外層迴圈呼叫:
變種 揹包問題 演算法設計 揹包問題
題目 乙個旅行者準備隨身攜帶乙個揹包,可以放入揹包的物品有n種,每種物品的重量和價值分別為wj,vj 如果揹包的最大重量限制是b,怎樣選擇放入揹包的物品以使得揹包的價值最大?目標函式 約束條件 演算法設計 設fk y 表示只允許裝前k 種物品,揹包總重不超過y 時揹包的最大價值。fk y 有兩種情況...
演算法設計 揹包問題
研究生課程系列文章參見索引 在信科的那些課 乙個旅行者準備隨身攜帶乙個揹包,可以放入揹包的物品有n種,每種物品的重量和價值分別為wj,vj 如果揹包的最大重量限制是b,怎樣選擇放入揹包的物品以使得揹包的價值最大?目標函式 約束條件 設fk y 表示只允許裝前k 種物品,揹包總重不超過y 時揹包的最大...
揹包問題2(完全揹包)
問題的提出 有n種物品,乙個容量為v的揹包,每種物品可以無限的加入揹包,第i種物品的價值為v i 花費為w i 求將那些裝入揹包能讓價值最大且不超過揹包的容量?思路 該題類似於01揹包,唯一的不同就是所有的物品可以無限取,這樣從物品的角度考慮就會有多中方法,不像01中的取或不取 當然01揹包作為最基...