i
i=物體索引(0-n),j
jj=揹包容量(0-w),dpdp
dp=最大價值
為了降低時間複雜度我們必須要改變dp陣列含義為。由於時間複雜度主要由i
ii和j
jj的含義決定,所以我們必須將i
ii和j
jj的含義於取值返回比較小的n
nn和v
vv陣列聯絡起來,將較大的w
ww與dpdp
dp陣列中存的值聯絡起來。這樣我們得到這樣的dpdp
dp陣列:dp[
i][j
]dp[i][j]
dp[i][
j]=從前i
ii個物品中選擇出價值為j
jj的物品的最小體積(若前i
ii個物品堆不出價值j
jj,則最小體積為inf
infin
f)
#include
#include
using
namespace std;
#define max_n 105
#define max_v 105
#define inf 1000000005
int n,w;
int w[max_n]
,v[max_n]
;int dp[max_n]
[max_n*max_v+1]
;//記錄狀態的陣列
void
dynamic_degradation()
}int result=0;
for(
int i=
0;i<=max_n*max_v&dp[n]
[i]<=w;i++)if
(i>result)
result=i;
cout<}
大揹包問題(01揹包)
大揹包問題 有n乙個重量和 值分別w i 和v i 專案。出的這些產品中的總重量不超過w專案。查詢所有選定的方案 值的最大總和值。其中,1 n 40,1 w i v i 10 15,1 w 10 15.這個問題給人的第一感覺就是普通的01揹包。只是,看完資料範圍會發現。這次價值和重量都能夠是很大的數...
揹包問題 01揹包
有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...
揹包問題(01揹包)
1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...