經典演算法問題 0 1 揹包

2021-09-26 10:56:39 字數 866 閱讀 9590

一、問題描述:

有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

二、問題分析

(1)用v[i]表示物品價值,w[i]表示物品重量。定義狀態dp[i][j]以j為容量為放入前i個物品(按i從小到大的順序)的最大價值。

(2)初始化邊界條件,v(0,j)=v(i,0)=0;

(3)對於每乙個物品,有兩種選擇方法,能裝下和不能裝下。

第一,包的容量比該商品體積小,裝不下,此時的價值與前i-1個的價值是一樣的,即v(i,j)=v(i-1,j);

第二,還有足夠的容量可以裝該商品,但裝了也不一定達到當前最優價值,所以在裝與不裝之間選擇最優的乙個,即v(i,j)=max{ v(i-1,j),v(i-1,j-w(i))+v(i) }其中v(i-1,j)表示不裝,v(i-1,j-w(i))+v(i) 表示裝了第i個商品,揹包容量減少w(i)但價值增加了v(i);

(4)得出遞推關係式:

① j② j>=w(i)     v(i,j)=max{ v(i-1,j),v(i-1,j-w(i))+v(i) }

#include#include#includeusing namespace std;

int fun(vector& w, vector& v, int n, int m)

else

}} return dp[n][m];

}int main()

for (int i = 1; i <= n; i++)

cin >> m;

cout << fun(score, time, n, m);

}

經典01揹包問題

乙個旅行者有乙個最多能裝m公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別為c1,c2,cn。求旅行者能獲得最大總價值。第 1 行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第 2 到 n 1行 每行兩個整數 wi,ci,表示每個物品的重量和價值。10...

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

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

經典問題之01揹包

動態規劃像乙個生產車間有好多連續的生產線 乙個階段就是乙個生產線 狀態就是每個生產線物品的狀態 決策就是生產線上根據物品的狀態而對物品的操作.01揹包問題 階段 第一生產線 放不放第乙個物品 第二生產線 放不放第二個物品 第n生產線 放不放第n個物品 第一生產線共 有n v1個選擇 v v時放不放 ...