20170801_动态规划之国王和金矿

一文弄懂动态规划(DP Dynamic Programming)下楼梯,国王和金矿,背包问题,Dijkstra算法 动态规划 参考链接 漫画算法,什么是动态规划? DP 动态规划是一种分阶段求解决策问题的数学思想 题目一 问:下楼梯问题,有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶,请问有多少中走法。 思路 刚才这个题目,你每走一步就有两种走法,暂时不管0级到8级台阶的过程。想要走到10级,必然是从8级或者9级走的。那么问题来了,如果我们以及0到9级台阶的走法有x种,0到8级台阶有... 阅读详情

20170801_动态规划之国王和金矿

题目: 国王和金矿
有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。
参与挖矿工人的总数是10人。
每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。
要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?
1、400金/5人   2、500金/5人   3、200金/3人    4、300金/4人    5、350金/3人

动态规划问题:maxgold[W]

N:表示金矿的数量

W:表示工人的数量

G[N]:表示每座金矿的金砖量

P[N]:表示采取每座金矿需要的工人数量

状态和状态转移方程:

1、首先设计一个表格 maxgold[W+1]
2、初始化:当只有第 1 个金矿时,工人数量 i 从 1 开始增加到 W 时,maxgold[i] 表示所能得到的最大金砖。
3、当只有第 1 个和第 2 个金矿时,工人数量 i 也同样从 1 开始增加到 W 时,
    maxgold[i](已经根据状态转移方程进行修改了)表示所能得到的最大金砖。
4、依次类推,当只有第 1 个、第 2 个、第 3 个、第 4 个、第 5 个金矿时,工人数量i也同样从 1 开始增加到 W 时,
     maxgold[i](已经根据状态转移方程进行修改了)表示所能得到的最大金砖。
5、时间复杂度:O( N * W )
      空间复杂度:O( W )


//国王与金矿
/*
题目一:上楼梯有多少种走法
题目二: 国王和金矿
有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。
参与挖矿工人的总数是10人。
每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。
要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?
1、400金/5人   2、500金/5人   3、200金/3人    4、300金/4人    5、350金/3人
*/

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
/*
动态规划问题:maxgold[W]
1、首先设计一个表格maxgold[W+1]
2、初始化:当只有第1个金矿时,工人数量i从1开始增加到W时,maxgold[i]表示所能得到的最大金砖。
3、当只有第1个和第2个金矿时,工人数量i也同样从1开始增加到W时,
	maxgold[i](已经根据状态转移方程进行修改了)表示所能得到的最大金砖。
4、依次类推,当只有第1个、第2个、第3个、第4个、第5个金矿时,工人数量i也同样从1开始增加到W时,
	maxgold[i](已经根据状态转移方程进行修改了)表示所能得到的最大金砖。
5、时间复杂度:O( N * W )
   空间复杂度:O( W )
*/
int GetMaxGold(int N, int W, const vector<int> &G, const vector<int> &P)
{
	vector<int> premaxgold(W+1,0);			//设计一个结果表的前表
	vector<int> maxgold(W+1,0);				//设计一个结果表
	for(int i=1; i<=W; ++i)					//按列 初始化结果表:当只有第一座金矿时,i代表i个工人
	{
		if(i<P[0])
			premaxgold[i]=0;
		else
			premaxgold[i]=G[0];
	}
	//依次填充表格
	for(int i=0; i<N; ++i)				//i表示有前i个金矿时
	{
		for(int j=1; j<=W; ++j)
		{
			if(j<P[i])
				maxgold[j]=premaxgold[j];
			else
				maxgold[j]=max(premaxgold[j], premaxgold[j-P[i]]+G[i]);
		}
		premaxgold=maxgold;
	}
	return maxgold[W];
}

int main(void)
{
	int N=5;							//5个金矿
	int W=10;							//10个人:900
	//int W=13;							//13个人:1250
	//int W=1;							//1个人:0
	//int W=3;							//3个人:350
	//int W=7;							//7个人:650
	int g[]={400,500,200,300,350};
	vector<int> G(begin(g),end(g));		//每座金矿的含金量
	int p[]={5,5,3,4,3};
	vector<int> P(begin(p),end(p));		//每座金矿需要的人数
	int maxGold=GetMaxGold(N,W,G,P);
	cout<<maxGold<<endl;

	system("pause");
	return 0;
}


用金矿讲动态规划 用金矿讲动态规划,让初学者更加了解,快下载快下载快下载快下载快下载 立即下载

相关推荐

一篇教你杰理63系列蓝牙双设备主从连接传输数据过程及配置

首先打开632sdk的app_config.h文件,将宏CONFIG_APP_SPP_LE写0,将宏CONFIG_APP_MULTI写1,对应的CONFIG_BT_GATT_CLIENT_NUM写1代表我只连接一个主机设备。属性都可以修改为自己想要的属性,然后关掉文件,双击gatt_inc_generator.exe文件运行,就会自动弹出生成/更新后的gatt_profile_cfg.h文件,然后里面就是我们代码里面所需要的配置,都是十六进制表示,找到我们刚刚添加的服务属性配置,复制到代码里面去。

xiaolizaixian的博客 1378

动态规划算法入门基础(爬楼梯、国王与金矿)

1. 动态规划算法 题目描述:每次可以爬1个或2个台阶,问爬到第 n 个台阶,一共有多少种不同的方法。 动态规划中包含三个重要的概念:最优子结构、边界、状态转移公式 最优子结构是状态转移方程的的一个特例,状态转移公式是可以套用的 F(1)=1; //边界 F(2)=2; //边界 F(n)=F(n-1)+F(n-2) (n&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;=3); //状态转移方程,里面的n就是状态 F(10)...

越丘的博客 643

滤波算法-呼吸心跳信号检测方法(四)

呼吸心跳信号检测系列文章:信号滤波处理

yjh_2019的博客 6270

动态规划-国王的金矿(背包问题)

列子 问:有一个发现了5个金矿,每一个金矿的储量不同,需要参与挖掘的工人数也不通,参与挖矿工人的总数量是10人,每一座金矿要么全挖,要么不挖,不能派一般人挖一半的金矿,想要得到最多的黄金,应该挖取哪几座金矿呢?金矿1储存500金 需5人,金矿2储存400金需要5人,金矿3储存35...

chuanjuwk911774的博客 571

宇树机器狗go2—slam建图(1)点云格式

上一篇番外文章教大家如何在宇树机器狗go2的gazebo仿真环境中实现简单的导航运动,本期文章会教大家如何让宇树的机器狗go2在仿真环境中进行slam建图时经常会遇到的一些点云格式,在后续的slam建图和slam算法解析的时候会经常与这些点云信息打交道。宇树机器狗go2仿真会作为一个长期项目来进行不定期更新,仿真不只限于在gazebo上实现,后面还会在isaac sim等仿真平台上教大家如何搭建,其目的还是帮助各位都能以较低的成本加入到宇树机器狗go2的学习中。

古月居 3272

迅投miniQMT量化交易之【网格交易】的实现(25)——写在最后

和大家一起分享如何使用miniQMT实现我们自己的网格交易系统。如果您对量化交易感兴趣,欢迎一起交流。

tzzqn2008的专栏 829

动态规划:国王与金矿

题目来源 题目描述 题目解析 bok 递归 public static int climbStairs(int n) { if (n < 1){ return 0; } if (n == 1){ return 1; } if (n == 2){ ...

OceanStar的博客 2998

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | ICML 2024 | RT-DETR引入ICB交互式卷积模块和ASB自适应频谱模块,助力目标检测、异常检测有效涨点、含多种创新改进点

RT-DETR目标检测模型通过引入ICB和ASB模块实现性能提升。ICB模块采用多尺度卷积交互,有效捕获局部和长程依赖特征;ASB模块通过自适应频域滤波优化特征表示,降低噪声干扰。两者结合使模型在复杂场景中表现更优,显著提升检测精度和鲁棒性。文章详细介绍了模块原理、代码实现及配置方法,并提供了8种改进版本的YAML配置文件,适用于不同网络结构。这些创新改进为RT-DETR模型提供了高效涨点方案,特别适合复杂背景和高噪声环境下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 213

动态规划学习-【国王和金矿】

微信公众号 题目: 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿? 方法一:排列组合 每一座金矿都有挖与不挖两种选择,如果有N座金矿,排列组合起来就有2^N种选择。对所有可能性做遍历,排除那些使用工人数超...

Microstrong 1万+

Android15音频进阶之音效配置与解析(一百三十一)

本篇目的:Android15音频进阶之音效配置与解析。

Android系统攻城狮 2147

从0到1构建数据分析AI Agent:数据采集、洞察生成与报告自动化

在企业数字化转型的今天,数据分析师80%的时间被消耗在重复取数、数据清洗、报表排版等低价值劳动上,真正用于深度业务洞察和决策支持的时间不足20%。本文将从核心概念、技术原理、代码实现、落地实践全维度,教你从0到1搭建一套完整的数据分析AI Agent系统,实现「用户用自然语言提需求→Agent自动采集多源数据→AI自动挖掘业务洞察→自动生成符合业务要求的多格式报告」的全链路自动化,平均可将需求响应速度从天级压缩到分钟级,释放70%以上的分析师人力成本。

AI Python 编程之道的博客 472

动态规划之挖金矿问题(Python and Java)

动态规划 动态规划与 分治策略 很类似,都是将一个原问题分解为若干规模较小的子问题,递归的解决这些子问题,然后合并子问题的解得到原问题的解 两者区别在于,分治策略解决的问题中,各个子问题通常是相互独立的,但是动态规划中的各个子问题通常是有重叠的,当针对一个子问题的解求出后,可以将其记忆化储存 之前有讲过 动态规划之背包问题 ,这里是另一个比较经典的问题——挖金矿 挖金矿问题与分析 5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同;参与挖矿的工人总数是10人;每座金矿要么全挖,要么不挖,不能派一半

un357951的博客 1963

仿真学习系列(四十二):Sigrity仿真之走线阻抗和耦合检查

在高速电路设计中,走线的阻抗和信号线之间的耦合是影响信号完整性的重要因素。设计中可能会出现多种情况,导致阻抗变化或不匹配,例如线宽的变化、跨层分割等。传统的人工检查方法常常不够高效且易忽视细节。借助仿真软件,可以快速定位问题区域,并进行精确分析,从而有效避免或减少信号反射和串扰带来的影响。

案例文章,高速信号 425

LeetCode题解:如何求解金矿问题(动态规划)

题目 很久很久以前,有一位国王拥有5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人人数也不同。例如有的金矿储量是500kg黄金,需要5个工人来挖掘:有的金矿储量是200kg黄金,需要3个工人来挖掘… 如果参与挖矿的工人的总数是10。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半的金矿。要求用程序求出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿? 总共10个工人,A:400kg黄金/5人 B:500kg黄金/5人 C:200kg黄金/3人 D:300kg黄金/4人 E:350kg黄金/3人

your_棒棒糖的博客 1561

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

动态规划 入门一

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! ----第一节----初识...

ooaer的专栏 788

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

动态规划经典例题-国王的金矿问题

金矿问题 问题概述: 有一位国王拥有5座金矿,每座金矿的黄金储量不同, 需要参与挖掘的工人人数也不同。例如有的金矿储量是500kg黄金,需 要5个工人来挖掘;有的金矿储量是200kg黄金,需要3个工人来挖 掘…… 如果参与挖矿的工人的总数是10。每座金矿要么全挖,要么不挖,不能 派出一半人挖取一半的金矿。要求用程序求出,要想得到尽可能多的黄 金,应该选择挖取哪几座金矿? 什么是动态规划: 动态规划:将复杂问题简化为规模较小的子问题,再从简单的子问题自底向上一步一步递推,最终得到复杂问题的最优解 思路: 利用

千里之行,始于足下 1973

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维

题目四:0-1背包问题 题目:国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维数组peopleNeed[]。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要想得到尽可能多的黄金,应该选择挖取哪几座金矿? 功能:   (1) 要求max_n、max_people、gold和ppeopleNeed均为可输入的;   (2) 编写DP函数,求解答案F;   (3) 编写mai

weixin_43899069的博客 1581

【动态规划】国王与金矿

国王与金矿 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?(其实就是经典的背包问题,当然这个问题是来微信公众号-程序员小灰的,当然内容都是有自己思考的,他的文章中代码部分有部分错误) 500金/5人 400金/5人 200金/3人 300金/4人 350金/3人 最简单的思路还是暴力,先找出可以挖...

qq_34680987的博客 614

动态规划算法

动态规划的英文名叫Dynamic Programming,是一种分阶段求解决策问题的数学思想。它不仅用于编程领域,也应用于管理学、经济学、生物学 总结一点就是大事化小,小事化了 题目:求楼梯阶数 有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。 比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可以简写...

Adam_allen的博客 665

动态规划-国王与金矿

动态规划-国王与金矿 图文有点长,慢慢看 ———————————— 题目: 有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。 比如,每次走1级台阶,一共走10步,这是其中一种走法。我们可以简写成 1,1,1,1,1,1,1,1,1,1。 再比如,每次走2级台阶,一共走5步,这是另一种走法。我们可以简写成 2,2,2,2...

杨的博客 498

动态规划入门之国王的金矿

最近学习算法,对动态规划不太了解,使用的时候照搬转移方程式,知其然不知其所以然,今天看到一篇动态规划的教程,解释得非常通俗,原文在这里[动态规划入门教程] (http://blog.youkuaiyun.com/woshioosm/article/details/7438834),下面我用自己的记忆和理解讲讲我对动态规划的一点小心得。 首先,动态规划方法适合的题型4个基本特点是: 1、最优子结构,当前一

hhhzua的专栏 7738

动态规划(解析国王与挖矿问题)

动态规划包含三个重要概念: 最优子结构 边界  状态转移公式   例题1:爬楼梯问题 or 斐波拉契数列(单维度动态规划 相对容易) 例题2:国王和金矿 (双维度动态规划) 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖...

记录求学阶段的技术学习、项目实践与成长思考。 3817

动态规划-走台阶和国王与金矿问题

(1)、走台阶 有一座N级的台阶,从下往上走,每次走一个或两个台阶,那么走上N阶总共需有多少种方法? 考虑:假设台阶一共10级,那么只差最后一步就走到10级台阶,这时有几种情况? 有两种:第一种,从第9级到第10级;第二种从第8级到第10级。那么现在想想,不管之前0级-9级或者0级-8级走台阶的过程,最后一步肯定是从第9级或者第8级台阶走,假设从0级-8级台阶的走法有X种,0级-9级台阶的走...

zlx_code的专栏 1130

动态规划-国王与黄金

package com.algorithm.dynamicprogramming; /** * 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。 参与挖矿工人的总数是10人。 * 每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。 要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿? 500/5 200/3 * 300/4 350/3 400/5 * * @author Administrator * */ public class Ki.

weixin_40647543的博客 461

动态规划-如何求解金矿问题

参考书籍 《漫画算法-小灰的算法之旅》5.11 问题描述 假设现在有5座金矿,每座金矿的黄金存储量不同,需要参入挖掘的工人人数也不同。要求:参入挖矿的工人的总数是10.每座金矿要么全挖,要么不挖,不能派出一半人挖取一般黄金。要求用程序求出,要想得到尽可能多的黄金,应该选取那几座金矿? 金矿内容:400,500,200,300,350 所需人数:5,5,3,4,3 递归算法思路 对于每...

GoingJack博客 749
上一篇: 20170801_动态规划之爬楼梯有多少不同的方法
下一篇: 算法题常用函数集合
风暴计划
博客等级 码龄10年 465粉丝 480原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值