原题链接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的程序猿。