今天跟大家分享下算法思想中比较难的一种"动态规划",动态规划给人像是作战时常用的“迂回战术”,或者说是

游击战,在运动中寻找突破口。

一: 思想

首先要了解”动态规划“,必须先知道什么叫做”多阶段决策“,百科里面对这个问题解释的很全,我就load一段出来,

大家得要好好品味,好好分析。

上面图中最后一句话就定义了动态规划是要干什么的问题。

二:使用规则

现在我们知道动态规划要解决啥问题了,那么什么情况下我们该使用动态规划呢?

①  最优化原理(最优子结构性质):

如果一个问题的最优策略它的子问题的策略也是最优的,则称该问题具有“最优子结构性质”。

②  无后效性:

当一个问题被划分为多个决策阶段,那么前一个阶段的策略不会受到后一个阶段所做出策略的影响。

③  子问题的重叠性:

这个性质揭露了动态规划的本质,解决冗余问题,重复的子问题我们可以记录下来供后阶段决策时

直接使用,从而降低算法复杂度。

三:求解步骤

①   描述最优解模型。

②   递归的定义最优解,也就是构造动态规划方程。

③   自底向上的计算最优解。

④   最后根据计算的最优值得出问题的最佳策略。

四:与其他算法的差异

① 递归:  递归采用的是“由上而下”的解题策略并带有可能的”子问题“重复调用,时间复杂度自然高。

而”动态规划“采用”自下而上“并带有临时存储器保存上一策略的最优解,空间换时间。

② 分治:  同样两者都是将问题划分为很多的子问题,不同的是”动态规划“中各子问题是相互联系的。

③ 贪心:  要注意的是贪心算法每走一步都是不可撤回的,而动态规划是在一个问题的多种策略中寻找

最优策略,所以动态规划中前一种策略可能会被后一种策略推翻。

五:举例

动态规划中,最经典最著名的例子莫过于”背包问题“,现有:

苹果: 1kg    12¥

梨子: 1kg     3¥

葡萄: 1kg    10¥

板栗: 1kg    25¥

现有一个背包,只能装3kg水果,那么如何得到物品价值最大化?

using System;using System.Collections.Generic;using System.Linq;using System.Text;

namespace BeiBao{    public class Program    {        static void Main(string[] args)        {            Goods goods = new Goods()            {                LimitWeight = 3,                LimitNum = 4,                Weight = new double[4] { 1, 1, 1, 1 },                Value = new double[4] { 12, 3, 10, 25 }            };

            BackPack(goods, 0, 0, goods.Value.Sum());

            Console.WriteLine("经过最优化求解:\n");

            for (int i = 0; i < goods.Selected.Length; i++)            {                if (goods.Selected[i])                {                    Console.WriteLine("重量:" + goods.Weight[i] + " 价值:" + goods.Value[i]);                }            }

            Console.Read();        }

        static double maxValue;

        static bool[] selected = new bool[4];

        static void BackPack(Goods good, int i, double tw, double tv)        {            //当前追加物品的重量            var currentWeight = tw + good.Weight[i];

            //当前重量小于限制重量则继续追加            if (currentWeight <= good.LimitWeight)            {                selected[i] = true;

                //如果当前不是最后一个商品,则继续追加                if (i < good.LimitNum - 1)                {                    BackPack(good, i + 1, tw + good.Weight[i], tv);                }                else                {                    for (int k = 0; k < good.LimitNum; k++)                    {                        good.Selected[k] = selected[k];                    }                    maxValue = tv;                }            }

            selected[i] = false;

            //这里就体现了动态规划的根本目的,解决冗余            if (tv - good.Value[i] > maxValue)            {                if (i < good.LimitNum - 1)                {                    //排除当前物品所剩余的价值总值                    var exceptNotSelectedValue = tv - good.Value[i];

                    BackPack(good, i + 1, tw, exceptNotSelectedValue);                }                else                {                    for (int k = 0; k < good.LimitNum; k++)                    {                        good.Selected[k] = selected[k];                    }

                    maxValue = tv - good.Value[i];                }            }        }    }

    #region 商品的实体    /// <summary>    /// 商品的实体    /// </summary>    public class Goods    {        public double[] Value = new double[4];        public double[] Weight = new double[4];        public bool[] Selected = new bool[4];        public int LimitNum { get; set; }        public double LimitWeight { get; set; }    }    #endregion}

算法洗脑系列(8篇)——第七篇 动态规划相关推荐

  1. 算法洗脑系列(8篇)——第八篇 概率思想

    今天写最后一篇来结束这个系列,我们知道很多算法解决问题的步骤都是固定的,而概率算法每一步的选择都是随机的, 当在某些领域问题中通常比最优选择省时,所以就大大提高了算法的效率,降低了复杂度. 一:思想 ...

  2. 算法洗脑系列(8篇)——第六篇 回溯思想

    记得广告中经常听到过,抱着试试看的态度买了3个疗程,效果不错........  也经常听人说过什么车到山前必有路,船到桥头自然直. 哈哈,这种思想就是回溯思想,也可称为试探思想. 一: 思想 有时我们 ...

  3. 期货十三篇 第七篇 平仓篇

    在期货交易中曾经流行这样一句话:会开仓的是徒弟,会平仓的是师傅,会空仓的是大师傅. 在最初的期货交易过程中,我的开仓还算比较顺利,基本上都可以获得一定的盈利,但是我的平仓却十分糟糕,往往把自己的盈利单 ...

  4. 《两日算法系列》之第四篇:隐马尔可夫模型HMM

    目录 1. 定义与假设 2. 相关概念的表示 3. 三个基本问题 3.1. 概率计算问题 3.2. 学习问题 3.3. 预测问题 总结 1. 定义与假设 李雷雷所在城市的天气有三种情况,分别是:晴天. ...

  5. 转载 解密蓝牙mesh系列 | 第七篇【低功耗蓝牙】【承载层(bearer layer)】【节点与特性】【代理节点(Proxy Node)】【蓝牙mesh代理服务】【发现代理节点】【代理协议】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了 ...

  6. 洗脑 方法篇 洗脑集中营(转载)

    当传销风潮席卷全国的时候,只有一种人觉得恐惧,就是了解"洗脑"内幕并且没有被洗脑的人.参与传销者已经被彻底"洗脑",他们作为传销组织虔诚的信徒,生活在亢奋的幸福 ...

  7. 奋斗的小孩系列 FPGA学习altera系列: 第七篇 添加激励及功能仿真操作

    奋斗的小孩系列 FPGA学习altera系列: 第七篇 添加激励及功能仿真操作 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPG ...

  8. 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7

    https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...

  9. 熬夜变傻有科学依据,人类睡觉时会被“洗脑”,科学家首次拍下全程

    点击上方"视学算法","星标"或"置顶" 关键时刻,第一时间送达 鱼羊 栗子 发自 凹非寺  本文转载自:量子位(QbitAI) 你睡着的时 ...

最新文章

  1. python生成递增序列_Python的6种内建序列之通用操作
  2. Ubuntu 18.04安装CUDA(版本10.2)和cuDNN
  3. Charles学习(四)之使用Map local代理本地静态资源以及配置移动端代理在真机上调试iOS和Android客户端...
  4. 交换机短路_你了解交换机的相关知识吗?还不赶快收藏起来
  5. Java lambda例子
  6. 太骚了!Python模型完美切换SAS,还能这么玩。。
  7. Mysql数据库安全管理配置
  8. 小米选择了总是打开方式_小米不计成本开启让利:70英寸4K大屏电视2999,K30 5G首卖...
  9. java.lang.IllegalStateException: UT010019: Response already commited
  10. linux 内核 发送数据类型,Linux内核数据类型及跨平台
  11. 东软 c语言笔试题,C语言笔试题及参考答案东软集团
  12. plc控制电机实验报告_五相十拍步进电动机控制-PLC课程实验报告
  13. 关于嘉立创的贴片小总结
  14. 虚拟机操作工具--Xmanager5 下载/安装/使用
  15. 详解Minimax算法与α-β剪枝
  16. 10款VS Code插件神器,超级实用
  17. 经典快速制作套打证书模板(doc)大全
  18. github中repositories与projects区别
  19. 第三课 DedeCMS仿站-更换主页模板
  20. 情人节程序员用HTML网页表白【烟花代码】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript

热门文章

  1. 聊聊大促秒杀系统设计
  2. 正则表达式及限制字数
  3. c语言选择排序输出指定趟数结果,C语言之选择排序 - 杨源鑫的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. 计算机word 2010版,Word 2010 用户入门
  5. 如何在word和pdf中插入文件
  6. 10种图算法直观可视化解释
  7. 环球企业家杂志:解密SAP进入电力市场幕后故事
  8. 杂谈:iphone 4s 会登陆中低端市场吗?
  9. Oracle数据库性能分析管理-IO分析
  10. 态势感知与安全运营平台详细介绍