在这规定时间内采摘草药,使得获得的草药总价值最大(动态规划)
- 初始化数组并输入
- 动态规划
- 输出
- 容易忘记初始化
O(n * T)
- 输入
- 动态规划
- 输出
#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]; //输出结果
}
动态规划问题,初始化一个数组来存储每个时间点的最大价值,并遍历所有草药和时间点来更新这个数组,最后输出总时间内的最大价值。