解法一:背包问题变形
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//经典背包问题加了个时间限制
struct BG {
int h; // 快乐度
int l; // 持续时间
int t; // 发起人离校时间
};
bool compare(const BG& a, const BG& b) {
return a.t < b.t; // 按离校时间升序排序
}
int main() {
int N;
while (cin >> N && N >= 0) { // 处理多个测试用例
vector<BG> bgs(N);
for (int i = 0; i < N; i++) {
cin >> bgs[i].h >> bgs[i].l >> bgs[i].t;
}
// 按离校时间升序排序(此处为变化的地方)
sort(bgs.begin(), bgs.end(), compare);
// 动态规划
int maxTime = bgs.back().t; // 最大时间
vector<vector<int>> dp(N + 1, vector<int>(maxTime + 1, 0)); // dp[i][j]
for (int i = 1; i <= N; i++) {
int h = bgs[i - 1].h, l = bgs[i - 1].l, t = bgs[i - 1].t;
for (int j = 0; j <= maxTime; j++) {
dp[i][j] = dp[i - 1][j]; // 不选择第 i 个 BG
if (j >= l && j <= t) { // 选择第 i 个 BG(此处为变化)
dp[i][j] = max(dp[i][j], dp[i - 1][j - l] + h);
}
}
}
// 找到最大快乐度
int maxHappiness = 0;
for (int j = 0; j <= maxTime; j++) {
maxHappiness = max(maxHappiness, dp[N][j]);
}
cout << maxHappiness << endl;
}
return 0;
}
解法二:dfs剪枝
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct BG {
int h; // 快乐度
int l; // 持续时间
int t; // 发起人离校时间
};
bool compare(const BG& a, const BG& b) {
return a.t < b.t; // 按离校时间升序排序
}
int maxHappiness = 0; // 最大快乐度
// DFS 搜索
void dfs(const vector<BG>& bgs, int index, int currentTime, int currentHappiness) {
// 更新最大快乐度
if (currentHappiness > maxHappiness) {
maxHappiness = currentHappiness;
}
// 剪枝:如果剩余 BG 的最大可能快乐度加上当前快乐度仍然小于 maxHappiness,则剪枝
int remainingHappiness = 0;
for (int i = index; i < bgs.size(); i++) {
remainingHappiness += bgs[i].h;
}
if (currentHappiness + remainingHappiness <= maxHappiness) {
return;
}
// 枚举每个 BG
for (int i = index; i < bgs.size(); i++) {
if (currentTime + bgs[i].l <= bgs[i].t) { // 时间限制剪枝
dfs(bgs, i + 1, currentTime + bgs[i].l, currentHappiness + bgs[i].h);
}
}
}
int main() {
int N;
while (cin >> N && N >= 0) { // 处理多个测试用例
vector<BG> bgs(N);
for (int i = 0; i < N; i++) {
cin >> bgs[i].h >> bgs[i].l >> bgs[i].t;
}
// 按离校时间升序排序
sort(bgs.begin(), bgs.end(), compare);
// 初始化
maxHappiness = 0;
// DFS 搜索
dfs(bgs, 0, 0, 0);
// 输出结果
cout << maxHappiness << endl;
}
return 0;
}