首页 > 编程语言 >PHP 动态规划算法

PHP 动态规划算法

时间:2022-10-31 17:34:29浏览次数:40  
标签:10 arr 动态 weight 重量 算法 价值 物品 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;
    }
}

标签:10,arr,动态,weight,重量,算法,价值,物品,PHP
From: https://www.cnblogs.com/guanchaoguo/p/16845104.html

相关文章

  • 常见排序算法总结(不详细)
    常见的排序算法有如下几种:插入排序直接插入排序折半插入排序希尔排序选择排序简单选择排序堆排序交换排序冒泡排序快速排序二路归并排序基数排序外部排序直接插......
  • 传统图像分割算法-基于区域的分割算法
    这类方法按照图像的相似性准则划分不同的区域块。其中较为典型的方法优:种子区域生长法、分水岭法、区域分裂合并法。种子区域生长法:首先通过一组表示不同区域的种子像素开......
  • Qt设置运行时动态库路径的几点说明
    Qt设置运行时动态库路径的几点说明Qt教程 2022-04-1601:00随着需求的不断增加,程序不断变大,用到的动态库也越来越多,到了发布程序的时候你会发现和可执行文件同一目录下......
  • 随机化算法解决圆排列问题 - python解法
    问题描述给定n个大小不等的圆,现要将这n个圆排进一个矩形框中,且要求各圆与矩形框的底边相切。圆排列问题要求从n个圆的所有排列中找出有最小长度的圆排列。例如,当n=3,且所给......
  • Java动态加载字节码
    Java字节码简单说,Java字节码就是.class后缀的文件,里面存放Java虚拟机执行的指令。由于Java是一门跨平台的编译型语言,所以可以适用于不同平台,不同CPU的计算机,开发者只需......
  • 字符串匹配算法-Sunday
    以往不论是上课还是各种资料书上,看到关于字符串匹配的算法,大抵都是KMP了。然而KMP的next数组理解起来颇为费劲,且容易忘记。在LeetCode刷题中偶然发现了一个叫Sunday的算法,不......
  • 算法竞赛中的小球放盒子问题
    背景:写题的时候遇到过很多关于这类问题的变种题,所以打算总结一下问题分类根据球是否不同,盒子是否不同,盒子是否为空,一共可以分为\(2^{3}\)种情况讨论Problem1题意......
  • Diff算法(面试)
    Diff算法探讨的就是虚拟DOM树发生变化后,生成DOM树更新补丁的方式。对比新旧两株虚拟DOM树的变更差异,将更新补丁作用于真实DOM,以最小成本完成视图更新。 具体流......
  • 第四届全国大学生算法设计与编程挑战赛(秋季赛)正式赛题解
    没时间写题解了,随便写两笔吧,看不懂可以联系QQ160042137901(Easy)直接暴力枚举每个状态及其所有转移,时间复杂度\((T2^nn^2)\)。02(Easy)二分答案,用一个单调队列或者优先......
  • vue计算,监听属性插槽和动态组件
    计算属性如果{{函数()}},每次页面刷新,函数都会重新执行函数---》当属性来使用,缓存<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><ti......