假設有n件物品和容量為m的揹包,已知每件物品的重量及價值,在滿足裝入揹包的物品重量最大的前提下,使得裝入物品的總價值最大。
(1) 二維動態規劃
d p[
i][j
]=ma
x(dp
[i−1
][j]
,dp[
i−1]
[j−w
eigh
ts[i
]]+v
alue
s[i]
)dp[i][j]=max(dp[i-1][j], dp[i-1][j-weights[i]]+values[i])
dp[i][
j]=m
ax(d
p[i−
1][j
],dp
[i−1
][j−
weig
hts[
i]]+
valu
es[i
])(2) 一維動態規劃
d p[
j]=m
ax(d
p[j]
,dp[
j−we
ight
s[i]
]+va
lues
[i])
dp[j] = max(dp[j], dp[j - weights[i]] + values[i])
dp[j]=
max(
dp[j
],dp
[j−w
eigh
ts[i
]]+v
alue
s[i]
)
在0-1揹包問題的基礎上,每個物品的數量均為無限個。#include
#include
#include
using
namespace std;
//二維動態規劃
intknapsack2
(int n,
int m, vector<
int>
&weights, vector<
int>
&values)
}return dp[n]
[m];
}//一維動態規劃
intknapsack1
(int n,
int m, vector<
int>
&weights, vector<
int>
&values)
}return dp[m];}
intmain()
d p[
j]=m
ax(d
p[j]
,dp[
j−we
ight
s[i]
]+va
lues
[i])
dp[j] = max(dp[j], dp[j - weights[i]] + values[i])
dp[j]=
max(
dp[j
],dp
[j−w
eigh
ts[i
]]+v
alue
s[i]
)
在0-1揹包問題的基礎上,每個物品的數量有限。int
knapsack3
(int n,
int m, vector<
int>
&weights, vector<
int>
&values)
}return dp[m]
;}
d p[
j]=m
ax(d
p[j]
,dp[
j−k∗
weig
hts[
i]]+
k∗va
lues
[i])
dp[j] = max(dp[j], dp[j - k * weights[i]] + k * values[i])
dp[j]=
max(
dp[j
],dp
[j−k
∗wei
ghts
[i]]
+k∗v
alue
s[i]
)
int
knapsack4
(int n,
int m, vector<
int>
&weights, vector<
int>
&values, vector<
int>
&nums)}}
return dp[m]
;}
01揹包問題 動態規劃求解
時間限制 1 sec 記憶體限制 128 mb 提交 48 解決 17 給定n種物品和乙個揹包,物品i的重量是wi,其價值為vi,問如何選擇裝入揹包的物品,使得裝入揹包的物品的總價值最大?在選擇裝入揹包的物品時,對每種物品i只能有兩種選擇,裝入或者不裝入,不能裝入多次,也不能部分裝入。第一行輸入物品...
0 1揹包問題,動態規劃求解
1.什麼是0 1揹包問題?有n個物品,它們有各自的體積和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?舉例int v 每個物品對應的價值 int w 每個物品對應的重量 int bag 10 揹包最大承重10 0 1揹包問題 public static void main st...
用動態規劃求解0 1揹包問題
0 1揹包問題描述 有n件物品和乙個重量為m的揹包。每種物品均只有一件 第i件物品的重量是w i 價值是p i 求解將哪些物品裝入揹包可使價值總和最大。動態規劃的基本思想 將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決...