解法一:背包问题变形
#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;
}