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

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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要挖掘金矿html源代码,首先需要了解HTML是什么。HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言,它使用标签和元素来描述和组织网页的结构和内容。 挖掘金矿html源代码的过程主要分为三个步骤:分析、提取和利用。 首先,在分析阶段,需要打开目标网页,并通过查看网页源代码来获取到HTML源代码。可以按下键盘上的Ctrl+U组合键,在浏览器中打开网页源代码,也可以在浏览器中使用开发者工具(一般是F12键)来查看源代码。复制源代码并保存。 接下来,在提取阶段,需要从HTML源代码中提取出有价值的信息。可以使用文本编辑器(如记事本)或专业的HTML编辑器(如Visual Studio Code)打开保存的源代码文件。通过观察和分析代码结构,识别出需要的数据,如网页标题、文本内容、链接地址等,并提取出来。 最后,在利用阶段,可以根据提取的信息进行进一步的操作。根据需求,可以在提取的文本内容中进行搜索或分析,找到目标关键词、统计词频等。或者根据提取的链接地址进行访问,爬取更多的网页信息。 需要注意的是,在进行这个过程时,应该遵守相关法律和道德规范,不应该非法获取或滥用他人的网页数据。 总之,挖掘金矿html源代码是一个技术活,需要有一定的HTML语言基础和相关工具的运用能力。希望我的回答能够帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值