問題:假設有一個揹包的負重最多可達8公斤,而希望在揹包中裝入負重範圍內可得之總價物品,假設是水果好了,水果的編號、單價與重量如下所示:
1 栗子 4KG $4500
2 蘋果 5KG $5700
3 橘子 2KG $2250
4 草莓 1KG $1100
5 甜瓜 6KG $6700
分析:揹包問題是關於最佳化的問題,要解最佳化問題可以使用「動態規劃」(Dynamic programming),從空集合開始,每增加一個元素就先求出該階段的最佳解,直到所有的元素加入至集合中,最後得到的就是最佳解。
源碼:
//揹包承重上限
$limit = 8;
//物品種類
$total = 5;
//物品
$array = array(
array("栗子", 4, 4500),
array("蘋果", 5, 5700),
array("橘子", 2, 2250),
array("草莓", 1, 1100),
array("甜瓜", 6, 6700)
);
//存放物品的數組
$item = array_fill(0, $limit + 1, 0);
//存放價值的數組
$value = array_fill(0, $limit + 1, 0);
$p = $newvalue = 0;
for ($i = 0; $i < $total; $i++) {
for ($j = $array[$i][1]; $j <= $limit; $j++) {
$p = $j - $array[$i][1];
$newvalue = $value[$p] + $array[$i][2];
//找到最優解的階段
if ($newvalue > $value[$j]) {
$value[$j] = $newvalue;
$item[$j] = $i;
}
}
}
echo "物品 價格<br />";
for ($i = $limit; 1 <= $i; $i = $i - $array[$item[$i]][1]) {
echo $array[$item[$i]][0] . " " . $array[$item[$i]][2] . "<br />";
}
echo "合計 " . $value[$limit];