题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3466
题目大意:给定N件物品,手里有M元钱,每一件物品都有价格,并且有相应的价值,但有一个要求就是手里的钱要大于等于qi才能买,求能得到的最大价值。
解题思路:将所有物品按照q-p排序,之后按照01背包解决。
AC代码:
#include <iostream>
#include <string.h>
using namespace std;
struct node{
int p,q,v;
int sub;
} items[505];
int main()
{
int n,m;
int dp[5005];
while(cin>>n>>m)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
cin>>items[i].p>>items[i].q>>items[i].v;
items[i].sub = items[i].q-items[i].p;
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
if(items[i].sub>items[j].sub)
{
node temp = items[i];
items[i] = items[j];
items[j]= temp;
}
}
}
// for(int i=1;i<=n;i++)cout<<items[i].sub<<" ";
// cout<<endl;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=items[i].q;j--)
{
if(dp[j-items[i].p]+items[i].v>dp[j])
dp[j] = dp[j-items[i].p]+items[i].v;
}
}
cout<<dp[m]<<endl;
}
return 0;
}