题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3466
题目的大意是:有n件物品,每个物品有个费用p,但要得到这件物品,你至少拥有的钱为q,每个物品也有一个价值v;
然后你又m的钱,问能买到的最大价值是多少;
这题一看就是01背包问题,但是稍微有点变化,刚开始直接做,题目给的测试数据都过不了,于是想了想,感觉应该按照q排下序再进行dp,试了下,测试数据虽然过了,但提交还是wa了,最后按照q-p升序拍下试了下,竟然过了,但是现在我还是不知道为什么;
参考代码如下:
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
int n,m;
struct tt
{
int p;
int q;
int v;
}a[501];
int comp(const void *x,const void *y)
{
if((*(tt *)x).q-(*(tt *)x).p>(*(tt *)y).q-(*(tt *)y).p)
return 1;
if((*(tt *)x).q-(*(tt *)x).p<(*(tt *)y).q-(*(tt *)y).p)
return -1;
}
int f[5001];
void execute()
{
memset(f,0,sizeof(f));
qsort(a,n,sizeof(a[0]),comp);
int i,j;
for(i=0;i<n;i++)
for(j=m;j>=a[i].q&&j>=a[i].p;--j)
{
if(f[j]<f[j-a[i].p]+a[i].v)
f[j]=f[j-a[i].p]+a[i].v;
}
cout<<f[m]<<endl;
}
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
cin>>a[i].p>>a[i].q>>a[i].v;
execute();
}
return 0;
}