題目鏈接: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;
}