Hello 大家好哇我是小亦今天我们在采药的基础上再看另一道题“疯狂的采药”,这道题呢非常简单难度为普及-(为洛谷难度分化)话不多说看思路:
这道题的问题是一个完全背包问题,因为每种草药可以无限制地采摘。在完全背包问题中,我们希望最大化在给定时间内可以采摘的草药的总价值。
动态规划数组dp[i]表示在i时间内能够获得的最大价值。我们遍历每种草药,对于每种草药,我们尝试将其多次加入到当前的采摘方案中,只要这样做不会超过时间限制。已下是我的参考代码均为AC状态贴代码
#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;
}
另外在这个代码中,我们首先读取总时间和草药种类数,然后读取每种草药的采摘时间和价值。接着,我们使用一个双层循环来更新动态规划数组dp。外层循环遍历每种草药,内层循环从后向前遍历动态规划数组,这样可以确保每种草药只被计算一次。最后,我们输出dp[t],即为在规定的时间内,可以采到的草药的最大总价值。讲完了下次见求关注嘿嘿