题目描述
小K是个苦命的孩子,他的师傅为了多赚钱,以减肥为理由,让他去采药,并说不完成不能吃饭。野地里有许多不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。要求在规定的时间t里,采到的草药的总价值最大。
输入要求
第一行有2个整数T(1≤T≤1000)和M(1≤M≤100),一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。
接下来的M行每行包括两个在1到100之间包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。
输出要求
1个整数,表示在规定的时间内可以采到的草药的最大总价值。
输入样例
70 3
71 100
69 1
1 2
输出样例
3
来源
NBU OJ
思路:
和动态规划下的01背包问题一样
struct zy
{
int time;
int val;
}z[100];
int dp[100][1000];
int max(int a,int b)
{
return (a > b) ? a : b;
}
int main()
{
int T,M;
cin>>T>>M;
int i = 0;
for(i = 1;i<= M;i++){
cin>>z[i].time>>z[i].val;
}
for(i=0;i<M;i++)
dp[i][0]=0;
for(i=0;i<T;i++)
dp[0][i]=0;
for(i=1;i<=M;i++)
{
for(int j=1;j<=T;j++)
{
if(j>=z[i].time)
dp[i][j] = max(dp[i-1][j],dp[i-1][j-z[i].time]+z[i].val);
else
dp[i][j] = dp[i-1][j];
}
}
cout<<dp[M][T]<<endl;
return 0;
}