之前的一篇文章中,我介绍了使用二维数组解决采药问题的方法,那么这次奔着优化代码的方向,再提供一种解题方法。
二维数组记录了第几个药和采药所需的时间t,接着画出表格来推出递推关系式,比如设置一个样例:
10 3
4 9
5 990
2 11
接着可以画出表格
通过第i行在第i-1行的基础上判断需不需要采第i个草药可以得出递推公式
dp[i][j]=max(dp[i-1][j-time[i]]+val[i],dp[i-1][j]);(time是储存采药所需时间的数组,val是储存草药价值的数组)
那么此时我们就能想到,既然第i行是在第i-1行的基础上判断需不需要采第i个草药,那不就是跟自己比吗?
所以我们就可以不用记下草药的序号,只需要留下采药所需的时间就行,至于该不该采药,在自己的基础上进行判断就行。
则建立一个数组dp[1000];
递推公式同二维数组非常相似,只是删掉了表示序号的那维数组。
dp[j]=max(dp[j],dp[j-a]+b);
接下来就是正片
#include<iostream>
using namespace std;
int dp[1000];
int main()
{
int t,m;
cin>>t>>m;
int a,b;
for(int i=1;i<=m;i++)
{
cin>>a>>b;//a代表采药所需的时间,b代表采药所需的价值
for(int j=t;j>=0;j--)
{
if(j>=a)
dp[j]=max(dp[j],dp[j-a]+b);
}
}
cout<<dp[t];
}
感谢观看,还望各位大佬指点。