找子問題:對於第i個物品要考慮的有兩種情況;第一,包的容量可以裝不下物品,這時揹包所裝物品的最大價值dp[i][j]和dp[i-1][j]相等;第二種情況是包的剩餘容量大於第i個物品的重量,這時可以選擇裝入或者不裝入第i個物品,我們對於裝入方式的選擇也是基於哪種情況下會使得揹包所含物品的價值最大而決定。這時揹包可裝物品的最大價值就是dp[i-1][j-weight(i)]+value[i]和dp[i-1][j]中的大者。解決0-1揹包問題的c++**實現如下確定狀態轉移方程:由上面的分析可以得出
** 當j=eight[i]時:dp[i][j]=max(dp[i-1][j-weight(i)]+value[i],dp[i-1][j])**
#include
using
namespace std;
const
int max=
1000+10
;int weight[max]
;int value[max]
;//dp[i][j]表示揹包容量為j時對於i件物品的最大價值
int dp[max]
[max]
;int
main()
} cout<[m]<}}
演算法空間複雜度優化:可以分析dp陣列,會發現每次求dp[i][j]時只與其上一行相關,而且是由右下角向左上方遷移的,因此可以將其修改為一維陣列以節省空間。為了計算時不影響下次計算,可以從右往左計算dp值。此時用dp[m]揹包容量為m時的最優解。通過不考慮揹包容量小於物品價值的情況以及利用滾動陣列,此時**可優化為如下:
while
(cin>>m>>n)
} cout<<}
當j=eight[i]時:dp[i][j]=max(dp[i][j-weight(i)]+value[i],dp[i][j])**相應的c++實現**經優化就變成了
#include
using
namespace std;
const
int max=
1000+10
;int weight[max]
;int value[max]
;//dp[i][j]表示揹包容量為j時對於i件物品的最大價值
int dp[max]
;int
main()
} cout<[m]<}}
#include
using
namespace std;
const
int max=
1000+10
;int weight[max]
;int value[max]
;int amount[max]
;//dp[i][j]表示揹包容量為j時對於i件物品的最大價值
int dp[max]
;int
main()
}}cout<<}
動態規劃 揹包問題
給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...
動態規劃 揹包問題
不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...
動態規劃 揹包問題
1 開心的金明 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每...