一、問題描述:
有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時放不放 ...