机器人挖金矿的动态规划算法
来源:互联网 发布:xp查mac地址命令 编辑:程序博客网 时间:2024/06/10 08:30
对于玩过星际的同学来说,都知道花50可以买一个机器人,然而每个机器人都有会在一定时间内采集一定的矿,例如每分钟可采矿5。于是有了我们今天的题目,输入初始机器人数量,初始金矿数量以及分钟数。求最多的采矿量。例如,初始金矿是50,初始机器人是5个,一分钟后的最大采矿量是75。 初始金矿是50,初始机器人是5个,二十分钟后的最大采矿量是745。
抛开初始金矿数量,我们可以知道影响采矿量的因素由采矿分钟数和各个分钟数的采矿机器人数量决定。我们可以用d代表采矿分钟数,用m代表采矿机器人数量。采矿量为f(d,m)。我们由此公式可以构造递归式
f(d,m) = max( f(d-1, m-n) + m *5 - n * 50) ( n=0,1..... f(d-1, m-n) / 50)
这个递归式看起来比较复杂,我们解释一下 f(d-1, m-n), 这是在第d-1分钟时,拥有不同数量的采矿机器人情况下的金矿拥有总量,m*5这是第d分钟m个机器人采矿的数量, 最后我们需要减去购买n个机器人花费的金额。为什么要购买n个机器人呢? 因为这里的f(d-1, m-n)时在第d-1分钟时m-n个机器人的金矿拥有量,所以为了算出第d分钟 的m个机器人的最大采矿量。所以要再购买n个机器人这样 n+ m-n = m。但是到底可以买多少个机器人呢?这是由目前的当前的金矿拥有量决定的。毕竟有多少钱,最多才能买多少钱的机器人。
有了这个递归式,我们就可以编码了:)
int calMaxMine(int days, int initialRobot, int initialGold){std::map<int,int>* mine = new std::map<int,int>[days + 1];mine[0][initialRobot] = initialGold;int buyRobot =0;for(int j = initialRobot; j < 1024; ++j){while(buyRobot * 50 <= initialGold){mine[0][buyRobot + initialRobot] =initialGold- (buyRobot * 50);++buyRobot;}}int result = 0;int max = 0;int maxRobots = initialRobot; for(int i = 1; i <= days; ++i){for(std::map<int,int>::iterator j = mine[i - 1].begin(); j != mine[i - 1].end(); ++j){int buyRobot =0;while(buyRobot * 50 <= j->second){if(mine[i][buyRobot + j->first] < mine[i - 1][j->first] + 5*(buyRobot + j->first) - (buyRobot * 50)){mine[i][buyRobot + j->first] = mine[i - 1][j->first] + 5*(buyRobot + j->first) - (buyRobot * 50);}if(max < mine[i][buyRobot + j->first] ){max = mine[i][buyRobot + j->first];}if(maxRobots < buyRobot + j->first){maxRobots = buyRobot + j->first;}++buyRobot;}}}delete [] mine;return max;}
- 机器人挖金矿的动态规划算法
- 算法 - 动态规划(通过金矿模型介绍动态规划)
- 动态规划入门教程之金矿的故事
- 动态规划入门之国王的金矿
- 金矿模型的动态规划入门
- 动态规划之挖金矿(背包问题)
- 动态规划基础之挖金矿问题
- 动态规划 - 金矿模型
- 动态规划问题,金矿模型的java实现
- 动态规划-用金矿模型用通俗的语言讲解
- 通过金矿模型介绍动态规划 (很好的动态规划入门介绍)
- 很特别的一个动态规划入门教程:通过金矿模型介绍动态规划
- 很特别的动态规划教程——通过金矿模型介绍动态规划
- 通过金矿模型介绍动态规划
- 通过金矿模型介绍动态规划
- 通过金矿模型介绍动态规划
- 通过金矿模型介绍动态规划
- 通过金矿模型介绍动态规划
- Server 2003安全脚本[转]
- JAVA中Applet的生命周期
- 设计模式php实例:适配器模式
- 【aoj 】 幂集(回溯)
- WEB渗透技术流程(收集)
- 机器人挖金矿的动态规划算法
- STM32菜鸟成长记录---1
- Android学习笔记(十)WIFI设备
- 华丽转身——如何从技术岗位走向管理岗位
- 软件防破解技巧
- pentest 报告
- 五子棋(Gomoku)博弈程序
- 一道微软面试题
- 将字符串中的指定字符替换为其他指定字符