【采药.】

采药

题目链接

题意

在这规定时间内采摘草药,使得获得的草药总价值最大(动态规划)

思路

  1. 初始化数组并输入
  2. 动态规划
  3. 输出

坑点

  1. 容易忘记初始化

算法一:动态规划

时间复杂度

O(n * T)

实现步骤
  1. 输入
  2. 动态规划
  3. 输出
代码
#include <iostream> 
using namespace std;
int a[10010],b[10010],f[10010];   
//每株草药的采摘时间、价值以及最优解数组
int main() 
{
    int t,n;   //总时间和草药的数目   
    cin>>t>>n;
    for(int i=1; i<=n; i++){
        cin>>a[i]>>b[i];}
   //读取每株草药的采摘时间 a[i] 和价值 b[i],并存储在数组 a 和 b 中
     
    for(int i=1; i<=n; i++){
        for{(int j=t; j>=a[i]; j--)
            f[j]=max(f[j-a[i]]+b[i],f[j]);}}
     //两个嵌套循环实现动态规划。外层循环遍历每株草药,内层循环遍历每个时间点:从总时间 t 递减到当前草药的采摘时间 a[i]。对于每个时间点 j,代码计算如果不采摘当前草药和采摘当前草药的两种情况下的最大价值,并更新数组 f 中的相应值。
 
    cout<<f[t];      //输出结果
}
 

总结

动态规划问题,初始化一个数组来存储每个时间点的最大价值,并遍历所有草药和时间点来更新这个数组,最后输出总时间内的最大价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值