题意
给定n个物品和钱数m,每个物品的价格p,限制钱数q,价值v,限制q的意思是你手头的钱必须大于等于q才能购买这个物品,问最后获得的最大价值。
思路
假设两个物品a,b,我们都要买下来,需要的钱至少是pa+pb+max(qa-pa,qb-pb),也就是先买差值最大的,留下来的钱可以满足差值小的的限制价格;
由于动态规划先更新的是子状态,所以要先更新差值小的,也就是qa-pa<qb-pb`在这里插入代码片`;
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=505,M=5005;
struct node
{
int p,q,v;
bool operator < (const node t)
{
return q-p<t.q-t.p;
}
} a[N];
int dp[M];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(dp,0,sizeof dp);
for(int i=0; i<n; i++)
scanf("%d%d%d",&a[i].p,&a[i].q,&a[i].v);
sort(a,a+n);
for(int i=0; i<n; i++)
for(int j=m; j>=a[i].q; j--)
dp[j]=max(dp[j],dp[j-a[i].p]+a[i].v);
printf("%d\n",dp[m]);
}
return 0;
}