

这是一个贪心算法的题,我觉得没什么问题但交oj上就是编译错误
哪有代码?而且事实上这也不是贪心算法
(参考样例:100 3 / 70 100 / 50 60 / 50 60 ,此时如果贪心会优先选择70 100,反而不如选择其他两个)
如果说按照比例贪心(价值/时间),则参考样例 100 2 / 50 100 / 100 150,按照比例会优先选择50 100,反而不如100 150
因此应考虑动态规划算法,代码如下:
#include <iostream>
#include <vector>
using namespace std;
int maxHerbValue(int timeLimit, vector<pair<int, int>> &herbs) {
int n = herbs.size();
vector<vector<int>> dp(n + 1, vector<int>(timeLimit + 1, 0));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= timeLimit; ++j) {
if (herbs[i - 1].first > j) { // If current herb cannot fit into the remaining time
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - herbs[i - 1].first] + herbs[i - 1].second);
}
}
}
return dp[n][timeLimit];
}
int main() {
int t, m;
cin >> t >> m;
vector<pair<int, int>> herbs(m);
for (int i = 0; i < m; ++i) {
cin >> herbs[i].first >> herbs[i].second;
}
cout << maxHerbValue(t, herbs) << endl;
return 0;
}
其中herbs[i-1]记录第i株草药的时间和价值,dp记录的是前i株草药,在花费时间不超过j时的最大价值
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - herbs[i - 1].first] + herbs[i - 1].second);
意为前i株花费时间j时,如果不采集第i株,则和前i-1株花费时间j的收益相同;如果采集i,则前i-1最多花费的时间不能超过j-time[i-1](time在这里被记在herbs.first中),因为要为采集i留出时间,那么前i-1株的最大收益为dp[i-1][j-herbs[i-1].first],第i株收益为herbs[i-1].second,二者相加即为采集i时的最大收益。
dp[i][j]即为上述二者的最大值。