题目大意:有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;
}