hdu 3466 Proud Merchants

来源:互联网 发布:商情数据 编辑:程序博客网 时间:2024/05/17 22:54

题目链接: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;}