HDU 2546 01背包问题

这里5元是个什么意思呢、差不多就是特殊情况了、

就是说最贵的那个东西先不买、并且最后要留下5元去买那个最贵的、

也就是说对现在金钱-5 拿剩下的钱去对减去最贵的商品后的商品dp、看这些剩下的钱能买多少价值的商品

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int qq=1000+10;
int price[qq<<1],dp[qq<<1];
int main()
{
    int n;
    while(~scanf("%d",&n)&&n){
        memset(price,0,sizeof(price));    //初始化 
        memset(dp,0,sizeof(price));
        for(int i=0;i<n;++i)
            scanf("%d",&price[i]);
        sort(price,price+n);
        int money;scanf("%d",&money);
        if(money<5){
            printf("%d\n",money);
            continue;
        }
        money=money-5;        //取出5元用于购买最贵的物品、
        for(int j,i=0;i<n-1;++i)
            for(j=money;j>=price[i];--j)
                dp[j]=max(dp[j],dp[j-price[i]]+price[i]);    //物品只有买或者不买两种选择
        printf("%d\n",money+5-dp[money]-price[n-1]);
    }
    return 0;
} 

 

posted @ 2016-04-04 17:13  我不萌、我要高冷  阅读(117)  评论(0编辑  收藏  举报