洛谷—题解 P1048 采药

原题链接P1048 采药

题目描述

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

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

输入输出格式

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

输出格式:
1个整数,表示在规定的时间内可以采到的草药的最大总价值。

题解:
所需知识:动态规划
计算每个单元格的价值时,使用的公式都相同。这个公式如下。

d[i][j]=max(d[i-1][j],d[i-1][j-V[i]+W[i])

d[I][j]表示当前在第i层,背包剩余容量为j时接下来的最大重量和,边界是i>n时d[i][j]=0,j<0时为负无穷(一般不会初始化这个边界,而是只当j>=V[i]时才计算第二项)。

代码如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

#define maxn 10001

int main()
{
	int T,N;
	int med[maxn][maxn];
	int tim[maxn],val[maxn];

	scanf("%d%d",&T,&N);

	for(int i=1;i<=N;i++)
		scanf("%d%d",&tim[i],&val[i]);

	for(int i=1;i<=N;i++)
	{
		for(int j=T;j>0;j--)
		{
			if(j>=tim[i])
			{
				med[i][j]=max(med[i-1][j],med[i-1][j-tim[i]]+val[i]);
			}
			else
			{
				med[i][j]=med[i-1][j];
			}
		}
	}

	printf("%d\n",med[N][T]);

	getchar();getchar();
	return 0;
}

新手上路,希望大家多多批评,多多指教,多多交流;

祝各位小伙伴,学的开心,A的愉快,早日成为大牛

我是Mario,一个立志考进MIT的程序猿。

发布了15 篇原创文章 · 获赞 12 · 访问量 1423

猜你喜欢

转载自blog.csdn.net/qq_41616301/article/details/89322765