一看到题就发现这是动态规划,题目要求最大获利之类的时候也一般想到动态规划,动态规划的题就是用空间换取时间,建立一个表存储需要重复计算的自问题,表的最后一项的值就是我们要求的最优值。
动态规划的题先分析需要求的最大值是什么,这道题是价值的最大值,而子问题就是草药种类以及时间量两方面不同情况下的最优解。
填表时先写好初始条件即无草药时,最大价值为0,无论时间为多少。
同理,无时间时,最大价值为0,无论草药种类。
填表时则需要考虑三个情况
一、拿得下草药时
1、不拿这个药(拿了药之后的剩余时间的最大值价值+这个药的最大价值比当前时间已算出的最大价值小)
2、拿这个药(拿了药之后的剩余时间的最大值价值+这个药的最大价值比当前时间已算出的最大价值大)
二、拿不下草药时
最大价值就等于假设没有这个草药时的最大价值,即之前的最大价值。
最后输出表中最后一个项即为最大价值
tip:代码中&显示似乎不太正确注意辨别
```c
#includeint main()
{
int t,m,dp[101][1001],cv[101],ct[101],i,j;
scanf("%d%d",&t,&m);
for(i=1;i<=m;i++){
scanf("%d%d",&ct[i],&cv[i]);
}//获取输入值并放在ct[]代表草药获取需要的时间
//cv[]代表草药价值
for(i=0;i<=m;i++){
dp[i][0]=0;
}
for(i=0;i<=t;i++){
dp[0][t]=0;
}//初始化边界值,无草药和无时间的情况
for(i=1;i<=m;i++){
for(j=1;j<=t;j++){
if(j>=ct[i]){
dp[i][j]=max(dp[i-1][j],cv[i]+dp[i-1][j-ct[i]]);
}
else{
dp[i][j]=dp[i-1][j];
}
}
}//填表
printf("%d",dp[m][t]);
return 0;
}
int max(int a,int b){//比较大小的函数(可替换,没啥大用)
if(a>b)
return a;
else
return b;
}
```
第一次写题解,如有错误希望大家见谅,如果感觉不清楚的可以看看《算法图解》,感觉上面解释得足够清楚
0.0分
5 人评分