Hello 大家好我是小亦今天呢也是来写一篇关于(洛谷的题目)采药话不多说见思路:
这个问题是一个典型的0-1背包问题,其中每种草药可以无限制地采摘,但是每种草药的采摘时间不能超过总的可用时间。我们的目标是在不超过总时间限制的情况下,最大化采摘草药的总价值#^.^#。
在这个问题中,我们可以使用动态规划来解决。我们可以定义一个动态规划数组dp
,其中dp[i]
表示在i
时间内能够获得的最大价值。然后,对于每种草药,我们考虑是否将其加入到当前的采摘方案中。
以下是解决这个问题的步骤:
-
初始化:创建一个动态规划数组
dp
,大小为t+1
,所有元素初始化为0。 -
遍历:对于每种草药,遍历动态规划数组,更新能够获得的最大价值。
-
更新:对于每种草药,如果将其加入到当前的采摘方案中,更新
dp
数组。 -
输出:
dp[t]
即为在规定的时间内,可以采到的草药的最大总价值。
嗯,说了那么多那我就贴代码了仅供参考代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10, mt = 1e7+10;
long long t[N], m[N], a, b;
long long dp[mt];
int main () {
cin >> a >> b;
for (int i = 1; i <= b; i++) {
cin >> t[i] >> m[i];
}
for (int i = 1; i <= b; i++) {
for (int j = t[i]; j <= a; j++) {
dp[j] = max(dp[j], dp[j - t[i]] + m[i]);
}
}
cout << dp[a];
return 0;
}