金矿

个人笔记:算法讲座3.5——氪金矿(01背包 复杂化)

梦想的初衷 提交于 2020-03-11 13:02:22
本文仅供参考学习使用,谢谢 问题描述: 当Alice努力打怪赚金币的时候,Bob确定了他的致富手段——到乌提斯的矿洞里挖氪金矿,因为他从达纳苏斯的暗夜精灵那里得到了一个特殊的道具,能够瞬间转移到一个氪金矿,却只消耗一个时间单位。挖取每堆矿石消耗的时间不同,当然产出量也不同,时间就是金钱,Bob在有限的时间T内,能挖到多少氪金矿? 输入: 第一行有两个数,时间T和矿洞中氪金矿的个数,第二行开始,每行两个数分别表示 挖这堆氪金矿消耗的时间和矿石产出量。 输出: Bob最多能够获得的矿石数。 思路分析: 01背包问题的状态转换方程: f[i,j] = Max{ f[i+1,j-Wi]+Vi( j >= Wi ), f[i+1,j] } 该问题是一个01背包问题的简单变形,首先要将这个问题分成子问题,然后优化子结构。 根据01背包问题的思想,将N个金矿按照顺序 移动 并 采集并,且逐个考虑时间为1-T时每个时间段所能产生的最大价值 这样每多移向一个金矿 1-T时间内所能产生的最大价值仅和上一次金矿的产生价值有关,即满足了 无后效性 和 逆向组解 考虑某时间段 在某金矿时的最大价值 需要考虑 a=该时间段减去 当前金矿所消耗的时间 在前一个金矿所产生的最大价值+当前金矿所能产生的价值 b=该时间段 在上一个金矿所能产生的最大价值 如果a

动态规划--矿工挖矿

回眸只為那壹抹淺笑 提交于 2019-12-06 05:43:11
动态规划三要素:边界、最优子问题、状态转移方程; 问题描述:现有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

环球金矿系统开发APP

ⅰ亾dé卋堺 提交于 2019-12-04 05:37:19
   环球金矿 系统开发 找【廖生:191-5743-0734微电】,环球金矿APP开发,环球金矿平台开发,环球金矿模式开发,环球金矿软件开发,环球金矿模式开发,环球金矿系统源码开发,   提示:我们专业软件开发公司,非平台   1、矿产类别   白银I   金额/元300-500签约时间11:50-12:00签约收益2日/8%金币2/4日收益4.00%GGM币/枚2   白银II   金额/元501-1000签约时间12:50-:00签约收益6日/17%金币4/8日收益2.83%GGM币/枚3   黄金|   金额/元1001-2000签约时间:50-14:00签约收益1日/5%金币6/12日收益5.00%GGM币/枚4   黄金II   金额/元2001-3000签约时间14:50-15:00签约收益5日/12%金币/18日收益2.40%GGM币/枚6   铂金I   金额/元3001-4000签约时间15:50-16:0O签约收益4日/12%金币/26日收益3.00%GGM币/枚8   铂金II   金额/元4001-5000签约时间16:50-17:00签约收益3日/10%金币18/36日收益3.33%GGM币/枚10   2、推广收益   直推5%二级4%三级6%   3、各级别升级条件与收益   注册用户:下载APP并实名认证,赠送20金币   正式用户:成功强中一

lb开金矿 QDUOJ 数论

為{幸葍}努か 提交于 2019-11-30 07:56:58
lb开金矿 QDUOJ 数论 原题链接,点我进去 题意 大家都知道lb有n个小弟(编号从2到n+1),他们可以按照规则传递信息:某天编号为i的小弟收到信息后,那么第二天他会给编号为j的小弟传达信息,其中gcd(i,j)=1(即i,j互质,且j可能不唯一)。现在,lb知道了一个新的钻石矿的信息,lb在第0天的时候告诉了他的第k个小弟(编号为k+1),问几天后他的小弟们都会知道这条消息? 解题思路 这个题看了看输入的数据范围, \(1e14\) 的范围,嗯,又看了看样例,回想了一下学长们出题的规律,感觉答案要么是1,要么就是2,但是奈何我不会,后来还是学长讲了一下这个题,让人恍然大悟。 首先,lb通知的第一个小弟会通知和他互素的所有人,这里如果通知的第一个小弟的编号是质数的话,那么好了,他会通知其他所有的小弟,因为质数和其他数都互质,等等,如果有个小弟的编号正好是第一个小弟编号的整数倍的话也是没法通知到的,所以这里需要进行一下特判,判断一下这个质数的2倍是不是超过了n,如果超过了,那么就需要两天,否者就是一天。如果第一个通知的小弟的编号不是质数,那么就需要两天, 代码实现 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace

国王与金矿

故事扮演 提交于 2019-11-29 04:45:10
自从受伤之后好久都打不起精神,好在今天垚哥提醒了我,让我一个人的时候就专心学习,跟朋友在一起的时候再玩。确实,一个人玩容易抑郁。 现在记录一下国王与金矿的编程题目: 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿? gold[] = {400, 500, 200, 300, 350}; people[] = {5, 5, 3, 4, 3}; 第一种就是暴力求解法,每一个金矿只有挖或者不挖的可能,一共2的n次方种情况;再把每种情况是否有员工不足筛选出来,最后求最大值。这种方法我试试自己用C++和Java写一下 package com.cai.javase.test国王与金矿; public class MostGold0 { public static int Violence( int n, int worker, int[] gold, int [] people ) { /** * k是相当于二进制01011,反向表示每一块金矿是否挖掘 * g是挖得的金矿 * p是用的人数 */ int maxgold = 0, k, g, p; for ( int i = 0; i < n*n; i++ ) { k