主要運用動態規劃的思想解決,以下提供比較精簡的**,簡潔易懂。
一、01揹包
1.一維01揹包
#include
#define max(a, b) a > b ? a : b
intmain()
, value[4]
=;//vol存放每乙個物品的體積 value存放對應的價值
//建立動態陣列
int* dp = new int
[v +1]
;memset
(dp,0,
sizeof
(dp)
*(v +1)
);for(
int i =
0; i < num; i++
)for
(int j = v; j >= vol[i]
; j--
) dp[j]
=max
(dp[j]
, dp[j - vol[i]
]+ value[i]);
std:
:cout <<
"最大價值: "
<
<< std:
:endl;
//記憶體釋放
delete[
] dp;
system
("pause");
return0;
}
2.二維01揹包
二維01揹包主要增加一維限制,在前面一維揹包基礎上增加一層迴圈即可。
#include
#define max(a, b) a > b ? a : b
intmain()
, qua[55]
=, value[55]
=;//建立動態陣列
int*
* dp = new int
*[v +1]
;for
(int i =
0; i < v +
1; i++
)for
(int i =
0; i < m; i++
)for
(int j = v; j >= vol[i]
; j--
)for
(int k = q; k >= qua[i]
; k--
) dp[j]
[k]=
max(dp[j]
[k], dp[j - vol[i]
][k - qua[i]
]+ value[i]);
std:
:cout <<
"最大價值: "
<
[q]<< std:
:endl;
//記憶體釋放
for(
int i =
0; i < v +
1; i++
) delete[
] dp[i]
; delete[
] dp;
system
("pause");
return0;
}
揹包問題 01揹包總結
寫這篇部落格的原因是因為自己初學揹包的時候覺得好玄學。只是知道怎麼寫,但是具體是為什麼覺得很玄妙。在此其實希望和我一樣的小白萌新早點明白其中的原理,其實原理很簡單,只要懂了這個圖,我想01揹包就不成問題了。首先要明確這張表是至底向上,從左到右生成的。關於01揹包的題目暫時整理了一點。1.簡單01揹包...
揹包問題總結
標籤 acm dp 揹包 n 物品,乙個揹包,每個物品價值wi 體積vi 揹包容量 c 求最大價值 對於物品 i可選可不選 fi j fi 1 j vi j 0 fi j max c j vi 給定 n 種物品和乙個揹包。第 i種物品的價值是 wi 其體積為vi 揹包的容量為 c 同一種物品的數量無...
揹包問題總結
揹包問題主要是分為三種 0 1揹包,完全揹包,多重揹包 1 0 1揹包 定義 何謂0 1揹包,可以這樣想,那裡有一堆值錢的東西,每一樣東西只有一件,他們的價值和體積都不一樣,現在要你從這n件裡面挑選一些放到乙個容量一定的揹包裡面,使得你的揹包裡的東西總價值最大。對於這些東西的每一件,你可以選擇放進你...