题目描述:
很久很久以前,有一个国王拥有5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人人数也不相同。例如:有的金矿存储量是500kg黄金,需要5个工人来挖;有的金矿存储量是200kg黄金,需要3个工人来挖…
如果参与挖矿的工人总数是10,每座金矿要么全挖,要么不挖,不能派出一半人挖取一半的金矿,想要得到尽可能多的黄金,应该选择挖哪几座金矿?
数据信息如下:
工人:共10名
200kg黄金/3人;300kg黄金/4人;400kg黄金/5人;500kg黄金/5人;350kg黄金/3人;
求:挖哪几座金矿才能得到最多的黄金?
问题解析:
根据最后一个金矿有挖和不挖问题可以划分为两个子结构:
至于选择哪一个子结构,就要看在倒数第二个金矿挖与不挖的取值了;以此类推,把问题划分为最小的结构;直到还剩0座金矿或者还剩0个工人为止。
设金矿数量为n,工人数量为w,金矿的含金量为数组g[],金矿所需开采人数的数组为p[],设F(n,w)为n个金矿,w个工人时的最优收益函数。
则:状态转移方程如下:
金矿数为0或者工人数为0的情况:F(n,w)=0(n=0或者w=0)
当所剩工人不够挖掘当前金矿(n金矿)时,只有一种最优子结构,即该金矿不挖(人没有减少,但是金矿数减1,说明不挖当前金矿),此时,F(n,w)=F(n-1,w)
在常规情况下,有两种最优子结构:
(当前金矿指的是n金矿,以下是n金矿不挖和n金矿挖时的情况)
F(n,w)=max(F(n-1,w),F(n-1,w-p[n])+g(n))

def get_best_gold_mining(w,p=[],g=[]):''':param w: 工人总量:param p: 开采金矿所需要的对应人数:param g: 每座金矿的黄金储量:return:'''result_table=[[0 for i in range(w+1)] for i in range(len(g)+1)]# 填充表格for i in range(1,len(g)+1): # 当前金矿是否选择开采for j in range(1,w+1):  # 当前的工人人数if j<p[i-1]: # p的下标是从0开始的,所以只能减1才能和当前金矿对应起来result_table[i][j]=result_table[i-1][j] #工人不够,当前金矿只能选择不挖,所以价值是上一个金矿的最优子结构else:result_table[i][j]=max(result_table[i-1][j],result_table[i-1][j-p[i-1]]+g(i-1)) # p[i-1]是金矿i对应的开采人数,g[i-1]是金矿i对应的黄金储量return result_table[len(g)][w]

动态规划:求解金矿问题相关推荐

  1. python实现动态规划求解给定矩阵的和最大的子数组(矩阵中数字正负均存在)

    本篇博文比较简单没有太多实际意义,只是为了练习一下,动态规划我并不熟悉,也是刚处于学习的阶段. 问题: 给定一个指定的矩阵,维数小于1000,在矩阵的所有子数组中寻找具有最大和的子数组求和输出. 思路 ...

  2. 1008-----算法笔记----------0-1背包问题(动态规划求解)

    1.问题描述 给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? 2.问题分析 上述问题可以抽象为一个整数规划问 ...

  3. 子串、子数组与子序列类型问题的动态规划求解(Leetcode题解-Python语言)

    一般来说,子串和子数组都是连续的,而子序列是可以不连续的,遇到子序列问题基本上都是用动态规划求解. 53. 最大子数组和(剑指 Offer 42. 连续子数组的最大和) class Solution: ...

  4. python用动态规划求删除路径_Python | 动态规划求解TSP

    解题思路主要有两部分: i为当前节点(城市),S为还没有遍历的节点(城市集合),表示从第i个节点起,经历S集合中所有的点,到达终点的最短路径长度. 回溯找到最优的路径,需要将S集合一一对应一个数字(类 ...

  5. 动态规划求解所有字符的组合数

    一,问题描述 给定若干个字符,求解 这些字符能够表示的最多组合个数.比如{'a','b','c'} 一共有七种组合.(每种组合没有重复的字符 且 组合的种数与顺序无关,如 ab 和 ba 是同一种组合 ...

  6. 使用动态规划求解算法问题的五大特点总结(附基于Python的参考代码)

    什么样的问题应使用动态规划求解 前言 一.求"最"优解问题(最大值和最小值) 1. 乘积最大子数组 问题描述 示例 题目分析 参考代码 2. 最长回文子串 问题描述 示例 题目分析 ...

  7. 01背包问题 动态规划求解方法 动态方程的详细解释 能理解的解释(附python代码)

    01背包问题属于组合优化问题:假设你要出门旅游,你现在有一个书包,这个书包的容量(capacity)有限,有很多物品如牙刷.防晒霜.雨伞.水杯等等,但书包装不下所有物品,因此我们必须有所取舍.那么通常 ...

  8. 动态规划求解多段图问题

    动态规划求解多段图问题(非递归) 问题描述 求解思路 动态规划逆序解法 逆序实现代码 动态规划逆序解法 顺序实现代码 问题描述 如图所示,在A处有一水库,现需要从A点铺设一条管道到E点,边上的数字表示 ...

  9. 数据结构和算法——用动态规划求解最短路径问题

    一.动态规划求解问题的思路     在<算法导论>上,动态规划的求解过程主要分为如下的四步: 描述最优解的结构 递归定义最优解的值 按自底向上的方式计算最优解的值 由计算出的结果构造一个最 ...

  10. C++ 动态规划求解TSP(旅行商问题)

    C++ 动态规划求解TSP(旅行商问题) 动态规划"四部曲" TSP问题介绍 使用动态规划分析TSP 问题结构分析 ==给出问题表示== ==明确原始问题== 递推关系建立 ==分 ...

最新文章

  1. ftp服务器版本信息可被获取,ftp服务器版本信息可被获取
  2. 关于Windows Firewall的一些资料
  3. 安装flume1.5
  4. python 建站需求_python建站基础环境配置
  5. Spring 事务与脏读、不可重复读、幻读
  6. python如何下载库_python中如何下载库
  7. AOS编排语言系列教程(一):开启AOS之旅,解锁各种自动化姿势
  8. 400本以上电子书、1000门以上课程会员免费看,快来领取!
  9. nginx http重定向https 无效_Golang设置https访问,以及http如何重定向到https
  10. paip.验证码识别---判断图片是否是彩色图片
  11. 【单目标优化求解】基于matlab非线性权重的自适应鲸鱼算法求解单目标优化问题(NWAWOA)【含Matlab源码 1665期】
  12. Ubuntu安装百度官方网盘客户端
  13. MySQL 临时表的原理以及优化手段
  14. Android 10 SystemUI 如何隐藏状态栏耳机图标和定位图标
  15. 【仅剩12小时】Python科研绘图教程,40+绘图案例(附完整代码)
  16. [LBS学习笔记4]地理特征POI、AOI、路径轨迹
  17. 【Python】利用python进行数据分析——以新型冠状病毒疫情为例
  18. linear regression and logistic regression 1
  19. 钱生钱最好的办法是什么?
  20. 如何用样本估计总体?(均值、方差、标准差)

热门文章

  1. pandas—groupby如何得到分组里的数据
  2. nhibernate 配置mysql_利用NHibernate与MySQL数据库交互
  3. logback源码解读笔记(springboot)
  4. C++:用栈实现反转链表,超简单!
  5. Weakly Supervised Data Augmentation Net-work (WS-DAN)
  6. Python爬虫实战之爬取QQ音乐之下载有版权的音乐(五)-1
  7. 微信小程序开发入门-个人笔记
  8. 使用JCreator进行servlet程序的开发
  9. 极路由3与存储的适配规划
  10. MCGS触摸屏设备地址修改-RS485