这是看到一位大神,写的关于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;
}

更形象的图为

大神博客链接

http://www.cnblogs.com/sdjl/articles/1274312.html

dynamic programming 学习的更多相关文章

  1. 动态规划 Dynamic Programming 学习笔记

    文章以 CC-BY-SA 方式共享,此说明高于本站内其他说明. 本文尚未完工,但内容足够丰富,故提前发布. 内容包含大量 \(\LaTeX\) 公式,渲染可能需要一些时间,请耐心等待渲染(约 5s). ...

  2. 强化学习三:Dynamic Programming

    1,Introduction 1.1 What is Dynamic Programming? Dynamic:某个问题是由序列化状态组成,状态step-by-step的改变,从而可以step-by- ...

  3. 算法导论学习-Dynamic Programming

    转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...

  4. 对动态规划(Dynamic Programming)的理解:从穷举开始(转)

    转自:http://janfan.cn/chinese/2015/01/21/dynamic-programming.html 动态规划(Dynamic Programming,以下简称dp)是算法设 ...

  5. 【动态规划】Dynamic Programming

    动态规划 一.动态规划 动态规划(Dynamic Programming)是一种设计的技巧,是解决多阶段决策过程最优化问题的通用方法. 基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这 ...

  6. #C++初学记录(动态规划(dynamic programming)例题1 钞票)

    浅入动态规划 dynamic programming is a method for solving a complex problem by breaking it down into a coll ...

  7. Algo: Dynamic programming

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  8. 动态规划(Dynamic Programming)算法与LC实例的理解

    动态规划(Dynamic Programming)算法与LC实例的理解 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Le ...

  9. Ⅲ Dynamic Programming

    Dictum:  A man who is willing to be a slave, who does not know the power of freedom. -- Beck 动态规划(Dy ...

随机推荐

  1. RobotFramework自动化测试框架-移动手机自动化测试Get Element Location关键字的使用

    Get Element Location关键字用来获取一个Element的Location位置,该关键字接收一个参数[ locator ] 示例1:使用Get Element Location来获取一 ...

  2. Ubuntu 共享 转载

    Ubuntu 14.04 文件服务器--samba的安装和配置 听语音 | 浏览:29526 | 更新:2014-10-10 22:28 | 标签:ubuntu 1 2 3 4 5 6 7 分步阅读 ...

  3. mac下selenium+python环境搭建

    selenium2+python的环境搭建主要需要python和selenium 1.python mac下自带了python,可以查看版本.当然可以选择安装其它版本的python. 2.seleni ...

  4. 非对称加密技术- RSA算法数学原理分析

    非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密. 但是对于其原理大部分同学应 ...

  5. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作

    Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...

  6. 使用一个for循环将N*N的二维数组的所有值置1

    <?php // 使用一个for循环将N*N的二维数组的所有值置1 $n = ; $a = []; ;$i<$n*$n;$i++){ $a[$i/$n][$i%$n] = ; } prin ...

  7. 插入排序-Python与PHP实现版

    插入排序Python实现 import random a=[random.randint(1,999) for x in range(0,36)] # 直接插入排序算法 def insertionSo ...

  8. python 读取本地文件批量插入mysql

    Uin_phone.txt 本地文件内容 有1000条,这里只是展示前几条,供参考 133584752 133584759 133584764 133584773 133584775 13358477 ...

  9. You may rarely look at it. But you'll always feel it

    You may rarely look at it. But you'll always feel it

  10. Java多线程之线程池详解

    前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...