給定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 行,...