背個小包遍地跑 01揹包問題(C )

2021-07-25 03:24:51 字數 2902 閱讀 8275

傳送門: 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...