栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

P1208 采药 OJ 动态规划解决O-1背包问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

P1208 采药 OJ 动态规划解决O-1背包问题

题目描述

辰辰是个很有潜能、天资聪颖的孩子,他的梦想是称为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说:"孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。"

如果你是辰辰,你能完成这个任务吗?

输入描述

输入的第一行有两个整数 T(1 <= T <= 1000)和 M(1 <= M <= 100),T 代表总共能够用来采药的时间,M 代表山洞里的草药的数目。接下来的 M 行每行包括两个在 1 到 100 之间(包括 1 和 100)的整数,分别表示采摘某株草药的时间和这株草药的价值。

输出描述

输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

样例输入

70 3

71 100

69 1

1 2

样例输出

3

 代码
#include

using namespace std;


//动态规划数组

class herb {
public:
	//价值 和 采摘时间
	int value;
	int time;
	double rate;
	// 方法
	herb() {

	}
	herb(herb& a) {
		this->value = a.value;
		this->time = a.time;
	}
};


int main() {
	int Day;
	int N;
	while (cin >> Day, cin >> N)
	{
		
		vector > dp(N + 1, vector(Day + 1));

		herb* H = new herb[N];
		for (int i = 1; i < N + 1; i++) {

			cin >> H[i].time;
			cin >> H[i].value;

		}
		// 列名是每一个物品的编号。
		// 行名是问题规模中的重量/时间

		for (int i = 0; i <= N; i++)
		{
			dp[i][0] = 0;
		}
		for (int i = 0; i <= Day; i++)
		{
			dp[0][i] = 0;
		}
		for (int i = 1; i < N + 1; i++)
		{
			for (int j = 1; j < Day + 1; j++)
			{
				//先判断能不能放进去
				if (H[i].time <= j) {
					//判断放进去好不好
					int nowValue = H[i].value + dp[i - 1][j - H[i].time];
					int oldValue = dp[i - 1][j];
					if (nowValue > oldValue) {
						dp[i][j] = nowValue;
					}
					else {
						dp[i][j] = oldValue;
					}
				}
				else
				{
					//放不进去
					dp[i][j] = dp[i - 1][j];
				}
			}
		}
		cout << dp[N][Day] << endl;

	}


	return 0;
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935392.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号