动态规划练习——采药

这是一道关于动态规划的题目,要求在限定时间内最大化采药的总价值。通过01背包问题的思路,建立状态转移方程b[i][t]=max{b[i-1][t],b[i-1][t-c[i]]+a[i]},并进行空间优化,以求得最优解。在初始化时,除b[0]至b[T]外,其余设为0,以此解决采药的最优化问题。" 128698630,8065640,UG/NX二次开发:UFUN使用UF_MODL_ask_feat_object获取特征对象,"['UG/NX二次开发', 'C++编程', '特征操作']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:

采每一株药都需要一些时间,每一株也有它自身的价值。一段时间内,可以采到一些草药。在规定时间内让采到的草药的总价值最大。

题目思路:

此题为01背包问题,令b[i][t]表示前i株药材恰在T时间内采完获得醉的价值,状态转移方程:b[i][t]=max{b[i-1][t],b[i-1][t-c[i]]+a[i]};

细节处理:

进行空间优化:b[t]=max{b[t],b[T-c[i]]+a[i]};初始化时除了b[0]至b[T]均设为0。

#include<bits/stdc++.h>
using  namespace std;
struct s{
int t;
int n;
}a[105];
int main()
{ int i,j,T,N;
 int b[1005];
 cin>>T>>N;
 for(i=0;i<N;i++) cin>>a[i].t>>a[i].n;
 for(i=0;i<=T;i++) b[i]=0;
 for(i=0;i<N;i++)
  {
      for(j=T;j>=a[i].t;j--)
 {if(b[j]<b[j-a[i].t]+a[i].n)
    b[j]=b[j-a[i].t]+a[i].n;}
  }
  cout<<b[T]<<endl;
  return 0;
}

感悟:根据01背包问题,只考虑第i件物品的策略,转化成一个只牵扯前i-1件物品的问题,寻找出题目的状态转移方程。

### 动态规划采药问题中的应用 #### 1. 背景介绍 动态规划是一种通过将复杂问题分解成更简单的子问题来解决问题的方法。对于采药问题而言,这是一个典型的01背包问题变种,在给定的时间限制下最大化所草药的价值。 #### 2. 状态定义 为了描述这个问题的状态,可以设定`dp[i][j]`表示考虑前`i`个物品(即草药),并且总时间不超过`j`的情况下可以获得的最大价值[^3]。 #### 3. 状态转移方程 当处理第`i`个草药时,有两种选择:要么不选这个草药;要么选择它并更新剩余可用时间内的最大价值。因此,状态转移方程如下: \[ dp[i][j] = \max(dp[i-1][j],\quad dp[i-1][j-w_i]+v_i)\] 其中,\(w_i\)代表第`i`个草药所需的时间,\(v_i\)为其对应的价值。这里假设如果当前时间为负数,则该方案不可行[^5]。 #### 4. 边界条件 初始化时,设所有`dp[0][*]`均为0,意味着没有任何草药可选时获得的价值为零。另外,对于任意时刻超过允许范围的情况也应视为非法输入,其对应的`dp[*][<invalid>]`同样置为0或者不予计算。 #### 5. Python实现示例 以下是基于上述理论的一个Python版本解决方案: ```python def collect_medicine(time_limit, n, times, values): # 初始化二维数组用于存储中间结果 dp = [[0]*(time_limit+1) for _ in range(n+1)] for i in range(1, n+1): # 遍历每一个药品 for j in range(time_limit,-1,-1): # 倒序遍历可能的时间点 if j >= times[i-1]: dp[i][j] = max(dp[i-1][j], dp[i-1][j-times[i-1]] + values[i-1]) else: dp[i][j] = dp[i-1][j] return dp[n][time_limit] if __name__ == "__main__": time_limit = 70 # 设定时限 num_of_items = 5 # 物品数量 # 各项花费时间和价值列表 item_times = [8, 9, 10, 12, 15] item_values = [16, 18, 22, 25, 30] result = collect_medicine(time_limit, num_of_items, item_times, item_values) print("Max value:",result) ``` 此代码片段展示了如何构建一个二维表格来记录不同状态下所能达到的最佳效果,并最终返回最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值