PHP 动态规划算法

动态规划实现 背包问题

  • 题目
  • 假设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;
    }
}
posted @ 2022-10-31 17:23  vx_guanchaoguo0  阅读(82)  评论(0编辑  收藏  举报