动态规划实现 背包问题
- 题目
- 假设6个物品 最大容量 10
- 重量分别是 【4,2,6,5,3】
- 价值分别 【6,3,5,4,6】
- 算法
- 利用贪心思路 准备
- 准备10个桶【0, 0, 0, 0, 0, 0,0, 0, 0, 0】
- 第一个物品
- 重量是4
- 价值 6
1 2 3 4 5 6 7 8 9 10 - 【0, 0, 0, 6, 6, 6,6, 6, 6, 6】
- 四号以后的通都可以装下a 物品 价值都是6 都符合要求
- 此时开始装第二个
* 重量是2
* 价值 3
1 2 3 4 5 6 7 8 9 10
* 【0, 3, 3, 9, 9, 9,9, 9, 9, 9】
* 2号以后的桶 都可以装下b 物品 价值都是9 都符合要求 - 此时一次装剩下的物品 当桶容量不足时 就和新加入的物品都对比谁大装谁
- 全部物品 装完后 获取十个桶最大值即可
点击查看代码
//初始化各个物品重量和价值数组
// a ,b, c, d, e
$weight_arr = array(4, 2, 6, 5, 3);
$value_arr = array(6, 3, 5, 4, 6);
//设置包最大重量为10
$bag_max = 10;
$items = count($weight_arr) - 1;
//中间的各种决策(依次放入物品a,b,c,d,e)
function dynamic($bag_max, $items, $weight_arr, $value_arr)
{
$cache_map = [];
for ($i = 1; $i <= $bag_max; $i++){
for ($j = 1; $j <= $items; $j++) {
$weight = $weight_arr[$j];
$value = $value_arr[$j];
$prev_value = (int)$cache_map[$j - 1][$i];
if ($weight < $i) {
$cache_map[$j][$i] = $prev_value;
} else {
$extra_value = $value + $cache_map[$j - 1][$i - $weight];
$cache_map[$j][$i] = max($prev_value, $extra_value);
}
}
}
//最终状态
for ($i = 1; $i <= $bag_max; $i++) {
echo $i . ':' . $cache_map[$items][$i] . PHP_EOL;
}
}