01背包--限制--hdu3466

来源:互联网 发布:淘宝天天特价是正品吗 编辑:程序博客网 时间:2024/06/07 09:51

题意:给出 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;}


0 0
原创粉丝点击