这是看到一位大神,写的关于dynamic programming的博客,认为很好。简单分析下。然后给出链接。

背景问题就是
有一个国家,全部的国民都很老实憨厚,某天他们在自己的国家发现了十座金矿。而且这十座金矿在地图上排成一条直线,国王知道这个消息后很高兴。他希望可以把这些金子都挖出来造福国民,首先他把这些金矿依照在地图上的位置从西至东进行编号,依次为0、1、2、3、4、5、6、7、8、9,然后他命令他的手下去对每一座金矿进行勘測,以便知道挖取每一座金矿须要多少人力以及每座金矿可以挖出多少金子,然后动员国民都来挖金子。

题目补充1:挖每一座金矿须要的人数是固定的,多一个人少一个人都不行。
国王知道每个金矿各须要多少人手,金矿i须要的人数为peopleNeeded[i]。
题目补充2:每一座金矿所挖出来的金子数是固定的,当第i座金矿有peopleNeeded[i]人去挖的话,
就一定能恰好挖出gold[i]个金子。否则一个金子都挖不出来。

题目补充3:开採一座金矿的人完毕开採工作后,他们不会再次去开採其他金矿,
因此一个人最多仅仅能使用一次。
题目补充4:国王在全国范围内仅招募到了10000名愿意为了国家去挖金子的人。
因此这些人可能不够把全部的金子都挖出来。可是国王希望挖到的金子越多越好。
题目补充5:这个国家的每个人都很老实(包含国王),不会私吞不论什么金子。
也不会弄虚作假,不会说谎话。
题目补充6:有许多人拿到这个题后的第一反应就是对每个金矿求出平均每个人能挖出多少金子,
然后从高到低进行选择,这里要强调这样的方法是错的。假设你也是这样想的,请考虑背包模型,
当有一个背包的容量为10,共同拥有3个物品,体积各自是3、3、5,价值各自是6、6、9,
那么你的方法取到的是前两个物品,总价值是12,但明显最大值是后两个物品组成的15。

题目补充7:我们仅仅须要知道最多可以挖出多少金子就可以,而不用关心哪些金矿挖哪些金矿不挖。

那么,国王到底怎样知道在仅仅有10000个人的情况下最多能挖出多少金子呢?国王是怎样思考这个问题的呢?

为了更好让自己理解这个问题

先考虑比較简单的三座山的情况

从问题的最后一步入手。就是在要开採第三座金矿时,
假设如今有总人数 n人。

处理函数为f(可用人数,开採前m座金矿)。返回数目为前m座金矿的最大可採到的金子。

初始化这些数据

总人数75个人。75<80。没有能力全部开採金矿,

第一次 前3座金矿时
f(75,3)

须要考虑的问题:
1)人数是不是大于开採需求
2)是不是已经到最后一个

用伪代码表示为:

if(是最后一个金矿)
{if(人数够开採金矿)return 金矿金子elsereturn 0。
}
else  //不是最后一个金矿
{if(人数够开採){比較  本座金矿金子+f(前n-1座金矿)和 f(前n-1座金矿);return 最大的}else  //不够开採本座{return  f(前n-1座金矿);}
}

所以

f(75,3)
{return max(f(75,2),f(25,2)+300);
}f(75,2)
{return max(f(75,1),f(55,1)+110);
}f(25,2)
{return max(f(25,1),f(5,1)+110);
}f(75,1)
{return 100;
}f(55,1)
{return 100;
}f(25,1)
{return 100;
}f(5,1)
{return 0;
}

更形象的图为

大神博客链接
http://www.cnblogs.com/sdjl/articles/1274312.html

转载于:https://www.cnblogs.com/zsychanpin/p/7260236.html

dynamic programming 学习相关推荐

  1. ADPRL - 近似动态规划和强化学习 - Note 7 - Approximate Dynamic Programming

    Note 7 - 近似动态规划 Approximate Dynamic Programming 7. 近似动态规划 (Approximate Dynamic Programming) 7.1 近似架构 ...

  2. 强化学习(二)- 动态规划(Dynamic Programming)

    3.动态规划 3.1 介绍 术语动态规划(DP:Dynamic Programming) 指的是一个算法集合,可以用来计算最优策略,给定一个完美的环境模型,作为马尔可夫决策过程(MDP).经典的DP算 ...

  3. 动手学强化学习(三):动态规划算法 (Dynamic Programming)

    动手学强化学习(三):动态规划算法 (Dynamic Programming) 1. 简介 2. 悬崖漫步环境 3. 策略迭代算法 3.1 策略评估 3.2 策略提升 3.3 策略迭代算法 4.价值迭 ...

  4. ADPRL - 近似动态规划和强化学习 - Note 5 - Banach Fixed Point Theorem in Dynamic Programming

    动态规划中的巴拿赫不动点定理 5. Banach Fixed Point Theorem in Dynamic Programming 5.1 巴拿赫不动点定理定理 (Banach fixed poi ...

  5. 一道有关动态规划(Dynamic Programming)的网易面试题

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:机器学习算法实验室 最近遇到一道很经典的有关动态规划的网 ...

  6. 动态规划(Dynamic Programming)例题步骤详解

    文章目录 动态规划(Dynamic Programming)浅学 - 学习笔记 题目特点: 1.选择硬币组合问题:(Coin Change) 动态规划题四个核心步骤: 一.确定状态 二.转移方程 三. ...

  7. 动态规划|Dynamic Programming

    由于最近课设要用动态规划,翻阅资料学习一下. 动态规划 解决复杂问题的方法,把它们分解成更简单的子问题. 一旦我们看到一些例子,这个定义就有意义了.实际上,我们今天只看解问题的例子 解决DP问题的步骤 ...

  8. 动态规划(Dynamic Programming, DP)简介

    动态规划(Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最优子结 ...

  9. [欠驱动机器人]4,动态规划(Dynamic Programming)

    目录 前言 控制问题变成优化问题 新增成本(Additive cost) 图搜索的最优控制 连续动力学方程 HJB 方程 求出最小控制 数值求解J 方程逼近与数值迭代 线性方程逼近 网格上的值迭代 连 ...

最新文章

  1. SAP RETAIL 使用事务代码MM41创建商品主数据时不能激活检验类型?
  2. 近世代数--子环--怎么判断是不是子环?
  3. python 的datetime模块使用
  4. rstudio 关联r_使用关联规则提出建议(R编程)
  5. ibatis This SQL map does not contain a MappedStatement
  6. mp3播放程序c语言,Go语言音乐播放器
  7. [Python] numpy.ndenumerate() 获得一对数组坐标和值
  8. 5.Linux 高性能服务器编程 --- Linux 网络编程基础 API
  9. 收藏+下载!Flink 社区最全学习渠道汇总
  10. kbmmw 的HTTPSmartService中的跨域访问
  11. 手机内存带宽和分辨率
  12. 流式传输 android,通过RTSP将视频流式传输至Android
  13. php 月份英文缩写,php如何实现月份转换
  14. 方正飞鸿智能信息平台产品白皮书(二)
  15. 发布工程到私有仓库maven
  16. 最新鸽哒IM即时通讯系统源码+带安装教程,正常运行版,无报错
  17. 串口调试助手没有显示
  18. 从eclips到idea
  19. 学计算机英语的心得体会,英语学习心得体会
  20. LibreCAD_3编译遇到的问题

热门文章

  1. float和clear都是布局的属性
  2. [深度学习-实践]tensorflow_hub简单理解模型的生成与加载
  3. python最小二乘法求a b_python_numpy实用的最小二乘法理解
  4. 施密特正交化的几何解释
  5. Docker学习七:使用docker搭建Hadoop集群
  6. 东芝半导体-三极管和功率管-元器件后缀说明解释-L3F
  7. mysql用户授权开发者_Mysql添加用户与授权
  8. php 中绑定的 gd 库,为PHP添加GD库支持
  9. matlab中函数绝对值图像,ex的图像(绝对值的函数图像口诀)
  10. mysql 指定tcpip连接数_tcp ip连接数据库