傳送門: 01揹包問題(動態規劃c++)
傳送門 :01揹包問題
問題描述
01揹包是在m件物品取出若干件放在空間為w的揹包裡,每件物品的體積為w1,w2……wn,與之相對應的價值為p1,p2……pn。這招可以用來清空購物車。。。求解這個揹包能裝的最大價值。(物體不能分割)。
通俗點講就是:
揹包問題,可以理解為你的預算有限(揹包的體積有限),要在預算的範圍內買那些價值高(什麼是價值高,就是你覺得目前來說非常需要的東西,通常用權重來衡量它)的東西。
注:這招適用於所有物品都可得到,通過乙個類似鬆弛函式進行區域性優化,從而得到當前條件下的乙個最優解。
v_i
表示第i
個物品的體積,w_i
表示第i
個物品的價值。
這裡我們以揹包容積為10,有5個物品為例。體積4
3527
價值96141
先放第乙個物品(體積為4),**中表示(當前價值)。
實際上就是拿著當前的物品,從後向前以此鬆弛(更新)當前結果,即得解。
剩餘容積01
2345
6789
10第1個物品(體積4)00
009999999
第2個物品(體積3)00
0699915151515
第3個物品(體積5)00
0699915151515
第4個物品(體積2)00
469101315151919
第5個物品(體積7)00
46910
1315151919查詢0
046910
131515
1919
通過倒著查詢weight陣列,判斷是否可以放入該石頭,就可得出裝在包裡的物品編號。
e.g. 19 (通過去除冗餘最後乙個下標得到)是第4個物品,15是第2個物品,9是第1個物品。
talk is cheap, show you the code.
#include
#include
using
namespace
std;
int main(int argc, const
char * argv)
;//權重陣列
int stonevolume[numberofstone] = ;
int stoneweight[numberofstone] = ;
//當前遇到的石頭
int currentvolume = -1;
int currentweight = -1;
// 01 揹包問題
for (int i = 0; i < numberofstone; i++)
//如果放不下當前石頭 就跳出迴圈
if(jbreak;}}
for (int j = 0; j <= volumeofbackpack; ++j)
int backpackspace = volumeofbackpack;// 得到揹包空間
//通過查詢最後相同的數量得到實際的體積
while (weight[backpackspace] == weight[backpackspace-1])
//找到一共使用了多少空間(只壓縮最後乙個)
//順藤摸瓜找物品
//上面的**只能找出3 6 不能找出來3 5
01揹包問題 C
有i件物品和乙個容量為volume total的揹包。第n件物品的體積是c n 價值是w n 體積是指物品在揹包中佔據的位置,即放入的物品的總體積不能揹包總容量 每種物品僅有一件,可以選擇放或不放。求解將哪些物品裝入揹包可使價值總和最大。輸入物品的總個數i,和揹包的最大容積volume total ...
揹包問題詳解(c ) 01揹包
有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i件物品的體積是 v,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。第一行兩個整數 n,v用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,每行兩個整數 vi,wi用空格...
01揹包問題,完全揹包問題,多重揹包問題C 實現
基於 揹包問題九講 2.0 beta1.2 實現 參考 動態規劃之揹包問題系列 smon的文章 知乎 0 1揹包問題的動態規劃演算法 bat特白的文章 知乎 非常感謝各位的部落格解答,如果大家看完後有不理解的可以參考 也可以自己進行實現,這樣才能更深刻的理解。01揹包問題 int zeroonepa...