题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值。
mark:又是变种01背包,每做一个变种的,就是一种提高。。
按照q - p以由大到小的顺序排序,然后进行01背包的DP即可。
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int MAXN=5005;
int dp[MAXN];
struct Node
{
int p,q,v;
}node[505];
bool cmp(Node a,Node b)
{
return (a.q-a.p)<(b.q-b.p);
}
int main()
{
int n,m;
int i,j;
int p,q,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<=m;i++)
dp[i]=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&node[i].p,&node[i].q,&node[i].v);
}
sort(node,node+n,cmp);
for(i=0;i<n;i++)
{
for(j=m;j>=node[i].p;j--)
{
if(j>=node[i].q)
dp[j]=max(dp[j],dp[j-node[i].p]+node[i].v);
}
}
int ans=0;
for(i=1;i<=m;i++)
if(ans<dp[i]) ans=dp[i];
printf("%d\n",ans);
}
return 0;
}