题目大意:有n种物品,每个物品有三个属性p,q,v, p代表价格,当你手中的钱少于q时,商品不卖,v代表商品价值,
01背包的升级版,这里要将商品按p-q大小进行升序排列,因为这样可以保证每次更新的状态值从小到大递增,前面更新过的状态不会影响后面更新的状态。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
struct note
{
int p,q,v;
}a[600];
int dp[6000];
int n,m;
bool cmp(note a,note b)
{
return a.q-a.p<b.q-b.p;
}
int main()
{
freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a));
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,cmp);
for(int i=0;i<n;i++)
for(int j=m;j>=a[i].p;j--)
{
if(j>=a[i].q)
dp[j]=max(dp[j],dp[j-a[i].p]+a[i].v);
}
printf("%d\n",dp[m]);
}
}