动态规划--矿工挖矿
时间:2022-07-23
本文章向大家介绍动态规划--矿工挖矿,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
动态规划三要素:边界、最优子问题、状态转移方程;
问题描述:现有10个矿工,5个金矿,每个金矿有对应金子和需要开采的人数,问你最多能够获得多少金子?
这是一个典型的动态规划问题,动态规划的核心是如何将问题转换为重叠的子问题,并且写出状态转移方程。
首先我们定义相应的参数:
矿工个数:n=10
金矿个数:w=5
金子数量:g=[400,500,200,300,350]
需要人数:p=[5,5,3,4,4]
p[i]代表挖了第i个金矿所需人数,g[i]代表挖了第 i个金矿得到的金子数。令F(n,w)表示n个人挖w个金矿能够得到的最大金子数。
当n<p[i]时,也就是说挖第i个金矿的人数不够,那么此时可以获得的最大金子数就是挖第i-1个金矿时的金子:
F(n,w)=F(n,w-1)
那么我们当n>p[i]时,有以下方程:
F(n,w)=max(F(n,w-1),F(n-p[i],w-1)+g[i])
表示n个人挖w个金矿能够得到的最大金子数=最大值(n个人挖w-1个金矿,((n-p[i])个人挖w-1个金矿)+g[i]))
最终代码:
n=10
w=5
g=[400,500,200,300,350]
p=[5,5,3,4,3]
def goldMining(n,w,g,p):
#初始化数组,用于存储信息,注意为了更好计算,共有11列,第一列作为辅助位
dp = [[0 for _ in range(n+1)] for _ in range(w)]
#边界就是10个人只挖第1个金矿
#[0, 0, 0, 0, 0, 400, 400, 400, 400, 400, 400]
for i in range(1,n+1):
if i<p[0]:
dp[0][i]=0
else:
dp[0][i]=g[0]
#依次遍历金矿,人数
for i in range(1,w):
for j in range(1,n+1):
#如果当前人数小于挖这座金矿的人数
if j<p[i]:
#则当前最大金矿就是挖前一个金矿的相应人数的值
dp[i][j]=dp[i-1][j]
else:
#否则就用如下公式计算
dp[i][j]=max(dp[i-1][j],dp[i-1][j-p[i]]+g[i])
return dp
dp=goldMining(n,w,g,p)
for i in range(len(dp)):
print(dp[i])
最终结果:
可以看到,我们最终可以获得的最大金子数是900,也就是挖第一个和第二个金矿。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP常用函数之根据生日计算年龄功能示例
- Laravel 之url参数,获取路由参数的例子
- PHP call_user_func和call_user_func_array函数的简单理解与应用分析
- PHP常用函数之获取汉字首字母功能示例
- 浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
- tp5 实现列表数据根据状态排序
- mac pecl 安装php7.1扩展教程
- tp5.1 实现setInc字段自动加1
- Laravel 前端资源配置教程
- laravel框架语言包拓展实现方法分析
- PHP使用JpGraph绘制折线图操作示例【附源码下载】
- Laravel Eloquent分表方法并使用模型关联的实现
- 关于laravel模板中生成URL的几种模式总结
- Laravel基础-关于引入公共文件的两种方式
- Laravel框架Blade模板简介及模板继承用法分析