0 1揹包問題 演算法概論 c c 實現

2021-09-19 05:14:14 字數 2433 閱讀 2298

給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為w(假定物品重量與揹包容量值均為整數)

,應如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大?設計乙個動態規劃演算法,求解揹包問題。

利用動態規劃實現

1、定義子問題:

首先考慮引數的確定,在揹包問題中,有關引數有 第i件物品以及加入物品後剩餘的weight,在這裡我們定義從1到i的取部分物品的最優解為b(i,w)。

2、確認dp方程:

這裡就有兩種情況

case 1:到第i-1件物品時,揹包已經滿了,顯然價值已經最大,那麼此時b(i,w)=b(i-1,w);

case 2:當揹包未滿的時候,最優解就是加入第i件物品或不加入第i件物品較優的那個,即max

那麼base case就是沒有物品時的總價值,即b(0,0)=0;

綜合起來得到:

這裡我們假設每一件物品的重量都是整數,那麼根據動態規劃的基本方法,我們建立乙個矩陣來求解這個dp方程。

我們先給出偽**,具體**實現見下方

我們來看一下這個演算法的時間複雜度:

這裡可以看出來,這個演算法的時間複雜度不僅與n(物品個數)有關,還與揹包的最大載重有關,而蠻力法的時間複雜度顯然是物品序列的自己個數即o(2^n),假如w >2^n時,動態規劃反而低效。

/*給定n種物品和一揹包。物品i的重量是wi,其價值為vi,揹包的容量為w(假定物品重量與揹包容量值均為整數)

,應如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大?設計乙個動態規劃演算法,求解揹包問題。*/

#include

#include

using namespace std;

void

knapsack

(int products_count,

int capacity, vector<

int>

&weight, vector<

int>

&value,vector

int>>

&result)

else

result[i]

[w]= result[i -1]

[w];}}

}void

print

(vector

int>>

&result, vector<

int>weight, vector<

int>

&x,int products_count,

int capacity)

} x[1]

= result[1]

[capacity]?1

:0;}

intmain()

for(

int i =

1; i <= products_count; i++

) vector

int>>

result

(products_count +

1, vector<

int>

(capacity +1,

0));

//初始化結果矩陣

「0 1揹包」 回溯演算法 C C實現

include include c 輸入輸出流標頭檔案 using namespace std int n 總商品數量 int w 商品的總容量 int cp 0,cw 0 當前裝入價值 當前裝入重量 int bestp 0 初始化最優解價值 bool x 10 bestx 10 可行解儲存陣列 和...

0 1揹包問題(c c )

問題介紹 現在有乙個可以載重w的揹包和n個物品,每個物品的重量和 分別為wi 和vi 請選擇所裝物品,使得在不超過揹包載重的前提下,揹包裡的物品 最高。include include using namespace std w 揹包最大載重 n 物品總數 ws 物品重量 vs 物品價值 res i ...

演算法(揹包問題 01揹包問題)

01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...