hdu 3466 Proud Merchants

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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章