题目大意:有N件东西,M的钱
要买一件东西的话,就要花费P的钱,且当前所拥有的钱不能少于Q,买了该商品的话,可获利V
问最大获利是多少

解题思路:按照贪心的思想来看的话,应该是限制最高的东西先买,或者花费最低的东西先买,这样的话,就排个序
按(限制-花费)的从大到小排序
接下来就是01背包的问题了

dp[i]表示的是花费了i的价钱能得到的最大价值

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 510;
const int M = 5100;

struct Item{
    int p, q, v;
}item[N];

int n, m;
int dp[M];

bool cmp(const Item &a, const Item &b) {
    return a.q - a.p > b.q - b.p;
}

void init() {
    for (int i = 0; i < n; i++) 
        scanf("%d%d%d", &item[i].p, &item[i].q, &item[i].v);
    sort(item, item + n, cmp);
}

void solve() {
    memset(dp, 0, sizeof(dp));
    for (int i = 0; i < n; i++)  
        for (int j = max(item[i].q - item[i].p, 0); j + item[i].p <= m; j++) 
            dp[j] = max(dp[j], dp[j + item[i].p] + item[i].v);

    int ans = 0;
    for (int i = 0; i <= m; i++)
        ans = max(dp[i], ans);
    printf("%d\n", ans);
}

int main() {
    while (scanf("%d%d", &n, &m) != EOF ) {
        init();
        solve();
    }
    return 0;
}