動態規劃求解揹包問題

2021-10-24 05:57:53 字數 2412 閱讀 5525

假設有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]

)

#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()

在0-1揹包問題的基礎上,每個物品的數量均為無限個。

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]

)

int

knapsack3

(int n,

int m, vector<

int>

&weights, vector<

int>

&values)

}return dp[m]

;}

在0-1揹包問題的基礎上,每個物品的數量有限。

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 求解將哪些物品裝入揹包可使價值總和最大。動態規劃的基本思想 將乙個問題分解為子問題遞迴求解,且將中間結果儲存以避免重複計算。通常用來求最優解,且最優解的區域性也是最優的。求解過程產生多個決...