题意:给出 Pi 物品花费,Qi满足钱数大于Qi才可以购买,Vi物品价值
给出N个物品 ,M钱,购买的最大价值
思路:
典型01背包,但因为又有Qi作为限制,因此要保证(Vi*1.0)/(Qi-Pi)的单位价值最大
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
struct p
{
int Pi;
int Qi;
int Vi;
}goods[505];
int dp[20000];
int cmp(struct p a,struct p b)
{
return (a.Vi*1.0)/(a.Qi-a.Pi)>(b.Vi*1.0)/(b.Qi-b.Pi);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
cin>>goods[i].Pi>>goods[i].Qi>>goods[i].Vi;
}
sort(goods+1,goods+n+1,cmp);
for(int i=1;i<=n;i++)
{
for(int j=m;j>=goods[i].Qi;j--)
{
dp[j]=max(dp[j],dp[j-goods[i].Pi]+goods[i].Vi);
}
}
cout<<dp[m]<<endl;
}
return 0;
}