这是看到一位大神,写的关于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. JavaScript系列----面向对象的JavaScript(1)

    1.面向对象的编程 1.1.什么是面向对象编程 面向对象编程:即是把能够完成独立完成一部分功能的代码封装在一起,组成一个类. 举个例子来说: 这里有一把枪, 枪的种类很多,有步枪,机关枪,阻击枪... ...

  2. Mybatis面试整理

    #{}和${}的区别 #{}是预编译处理,${}是字符串替换. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值: Mybatis ...

  3. webStorm恢复误删除文件或工程

    背景: 提交git时可能由于没有提交所有文件,不知什么原因导致最近几天所写文件全部消失,所改文件全部恢复到以前.最终通过webstorm找回项目.下面总结通过webstorm找回误删文件,或恢复到历史 ...

  4. android wear开发:为可穿戴设备创建一个通知 - Creating a Notification for Wearables

    注:本文内容来自:https://developer.android.com/training/wearables/notifications/creating.html 翻译水平有限,如有疏漏,欢迎 ...

  5. ASP.NET Core 2.0 MVC「远程」验证

    问题 如何 在ASP.NET Core MVC中使用[Remote]属性来实现模型验证 . 解 在 启动时, 为MVC配置中间件和服务. 添加一个模型. 添加一个控制器. 为jQuery添加一个Raz ...

  6. 接受第三方app分享的数据

    前段时间公司项目需要一个需求: 把第三方的app分享的数据接受到自己的apk中, 涉及到的第三方app是: Youtube/Amazon/NetFlix, 这些app通过分享功能把当前的信息分享出去. ...

  7. 采用Vue2.0开发的分页js组件

    2017-11-17 19:14:23 基于jQuery的分页插件相信大家伙已经都用过很多了,今天分享一下基于Vue2.0的分页插件pagination.js 由于项目需求,要求使用 Vue2.0 开 ...

  8. [转载] su和sudo

    转载自http://www.cnblogs.com/haichuan3000/articles/2123633.html Mandriva 说也奇怪,用root登录的用户比一般用户还难用,当初用FC6 ...

  9. 原生JS—实现图片循环切换的两种方法

    今天我们主要讲讲如何使用原生JS实现图片的循环切换的方法.多余的话我们就不多说了,我们一个一个开始讲吧. 1  原生JS实现图片循环切换 -- 方法一 在上栗子之前我们先简单介绍一下所用的一些知识点. ...

  10. jenkins~管道Pipeline的使用,再见jenkinsUI

    Pipeline在Jenkins里的作用 最近一直在使用jenkins进行自动化部署的工作,开始觉得很爽,省去了很多重复的工作,它帮助我自动拉服务器的代码,自动还原包包,自动编译项目,自动发布项目,自 ...