HDU 3466 Proud Merchants(01背包/按limit-price从小到大排序)
2016-03-30 16:24
441 查看
题目链接:
HDU 3466 Proud Merchants
题意:
有n个商品和预算m元。每个商品有个价格price,购买限制limit和价值val,必须在手中剩余的金额大于limit时才能购买这件商品.(limit>price)问在预算条件下最多能购买的商品价值是多少?
分析:
典型的01背包。一开始是按照limit对商品排序,WA了好几发。看了discuss才知道原来要用limit−pirce排序。
假设手中的钱足够买商品A和B的最少金额为total,那么显然total>limitA且total>limitB,
如果先买商品A的话,那还需要满足totalA−priceA>=limitB,即totalA=priceA+limitB,
如果先买商品B的话,那还需要满足totalB−priceB>=limitA,即totalB=priceB+limitA,
令totalA<totalB,化简:limitB−priceB<limitA−priceA.也就是limit−price大的先买。
再来考虑购买第i件商品时的状态转移方程(其中j是手中拥有金额数):
dp[j]=max(dp[j],dp[j−good[i].price]+good[i].val);
如果dp[j]=dp[j−good[i].price]+good[i].val,那么说明在手中有j元时在考虑前i件商品中首先购买了第i件商品则第i件商品应该是前i件商品中limit−price最大的,所以所有商品应该按照limit−price从小到大排序。
HDU 3466 Proud Merchants
题意:
有n个商品和预算m元。每个商品有个价格price,购买限制limit和价值val,必须在手中剩余的金额大于limit时才能购买这件商品.(limit>price)问在预算条件下最多能购买的商品价值是多少?
分析:
典型的01背包。一开始是按照limit对商品排序,WA了好几发。看了discuss才知道原来要用limit−pirce排序。
假设手中的钱足够买商品A和B的最少金额为total,那么显然total>limitA且total>limitB,
如果先买商品A的话,那还需要满足totalA−priceA>=limitB,即totalA=priceA+limitB,
如果先买商品B的话,那还需要满足totalB−priceB>=limitA,即totalB=priceB+limitA,
令totalA<totalB,化简:limitB−priceB<limitA−priceA.也就是limit−price大的先买。
再来考虑购买第i件商品时的状态转移方程(其中j是手中拥有金额数):
dp[j]=max(dp[j],dp[j−good[i].price]+good[i].val);
如果dp[j]=dp[j−good[i].price]+good[i].val,那么说明在手中有j元时在考虑前i件商品中首先购买了第i件商品则第i件商品应该是前i件商品中limit−price最大的,所以所有商品应该按照limit−price从小到大排序。
//1444K 46MS #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAX_N=510; const int MAX_VAL=5010; int n,m; int dp[MAX_VAL]; struct Good{ int price,limit,val; bool operator < (const Good a) const{ return (limit-price)<(a.limit-a.price); } }good[MAX_N]; int main() { //freopen("hdu3466in.txt","r",stdin); while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++){ scanf("%d%d%d",&good[i].price,&good[i].limit,&good[i].val); } sort(good+1,good+n+1); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=m;j>=good[i].limit;j--){ dp[j]=max(dp[j],dp[j-good[i].price]+good[i].val); } } printf("%d\n",dp[m]); } return 0; }
相关文章推荐
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- HDU 1000
- HDU 1001
- 2015-11-11 hdu新生赛 A题(AC)
- 2015-11-11 hdu新生赛 C题(结束后一发AC)