dynamic programming 学习
这是看到一位大神,写的关于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 金矿金子
else
return 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;
}
更形象的图为
dynamic programming 学习的更多相关文章
- 动态规划 Dynamic Programming 学习笔记
文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...
- 强化学习三:Dynamic Programming
1,Introduction 1.1 What is Dynamic Programming? Dynamic:某个问题是由序列化状态组成,状态step-by-step的改变,从而可以step-by- ...
- 算法导论学习-Dynamic Programming
转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...
- 对动态规划(Dynamic Programming)的理解:从穷举开始(转)
转自:http://janfan.cn/chinese/2015/01/21/dynamic-programming.html 动态规划(Dynamic Programming,以下简称dp)是算法设 ...
- 【动态规划】Dynamic Programming
动态规划 一.动态规划 动态规划(Dynamic Programming)是一种设计的技巧,是解决多阶段决策过程最优化问题的通用方法. 基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这 ...
- #C++初学记录(动态规划(dynamic programming)例题1 钞票)
浅入动态规划 dynamic programming is a method for solving a complex problem by breaking it down into a coll ...
- Algo: Dynamic programming
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- 动态规划(Dynamic Programming)算法与LC实例的理解
动态规划(Dynamic Programming)算法与LC实例的理解 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Le ...
- Ⅲ Dynamic Programming
Dictum: A man who is willing to be a slave, who does not know the power of freedom. -- Beck 动态规划(Dy ...
随机推荐
- 关于Spring在多线程下的个人疑问
在Web开发中,不可避免的是需要遇到并发操作的,并发操作就有可能会引发我们的多线程安全问题.比如说,我们多线程下访问同一个变量并且有一个线程做出修改那么就会使得我们另外的线程在不知情的情况下被修改自己 ...
- 【Kafka源码】ReplicaManager启动过程
在KafkaServer启动过程的入口中,会启动Replica Manager,众所周知,这是一个副本管理器.replica在Kafka中扮演的角色很重要,是保证消息不丢失的一个重要概念. repli ...
- 14.javaweb AJAX技术详解
一.简介 1, ajax:在不重新加载网页的前提下,与服务器交换数据并更新部分网页的技巧,但其本身并不是一种新技术 2, 核心:XMLHttpRequest对象.AJAX技术主要是通过此对象完成的 ...
- Servlet 学习笔记
Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...
- SqlServer 数据库附加问题:不是主数据库文件
一.前言 今天公司要切换数据库服务器,数据库文件大于2G,结果再附加到另一服务器的数据库里面,就产生了一个问题.如下: 标题:Microsoft SQL Server Management Studi ...
- Drools文档(六) 用户手册
用户手册 基础 无状态的知识Session Drools规则引擎拥有大量的用例和功能,我们要如何开始?你无须担心,这些复杂性是分层的,你可以用简单的用例来逐步入门. 无状态Session,无须使用推理 ...
- spring装配Bean过程
主要流程: 1.读取配置文件 2.实例化bean和填充bean属性 这个粗略的流程感觉更像是一个需求,有了这个需求,那么spring内部是怎么处理的呢? 我们知道spring的两个核心接口BeanFa ...
- laravel whereDate()方法的使用
今天在做日期查询,过过滤的时候,发现了一个问题,用where()语句,要求时间格式比较严格,比如你要查2017-09-23这一天的活动,你在输入框传入2017-09-23,系统会默认帮你补上后面缺少的 ...
- 状态机编程思想(2):删除代码注释(目前支持C/C++和Java)
有时为了信息保密或是单纯阅读代码,我们常常需要删除注释. 之前考虑过正则表达式,但是感觉实现起来相当麻烦.而状态机可以把多种情况归为一类状态再行分解,大大简化问题.本文就是基于状态机实现的. 删除C/ ...
- Less的嵌套规则
Less的嵌套规则 在使用标准CSS时,要为多层嵌套的元素定义样式,要么使用后代选择器从外到内的嵌套定义,要么给这个元素加上类名或 id 来定义.这样的写法虽然很好理解,但维护起来很不方便,因为无法清 ...