HDU 2546 饭卡(01背包)

来源:互联网 发布:获取js对象的方法 编辑:程序博客网 时间:2024/06/05 03:30

题目链接:
HDU 2546 饭卡
题意:
中文题意。
分析:
问题的核心就是在钱总数小于5之前尽可能的使金钱总数最小,然后用生下的>=5的钱去购买最贵的物品。
先将所有商品按价格排序,然后将最贵的保留,因为一定会购买它!而且最优的情况是用5元钱购买它!
所以问题就变成如何用v-5元钱去购买剩下的n-1件商品来获得最大总价值,这就是典型的01背包了。
注意:
当初始v<5时,什么都不能购买,所以这时候剩余的最小金额还是v。

//46MS 1424K#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAX_N=1010;int n,v;int val[MAX_N],dp[MAX_N];int main(){    //freopen("hdu2546in.txt","r",stdin);    //freopen("hdu2546out.txt","w",stdout);    while(~scanf("%d",&n)&&n){        for(int i=1;i<=n;i++) scanf("%d",&val[i]);        scanf("%d",&v);        if(v<5) {            printf("%d\n",v);            continue;        }        sort(val+1,val+n+1);        memset(dp,0,sizeof(dp));        for(int i=1;i<n;i++){            for(int j=v-5;j>=val[i];j--){                dp[j]=max(dp[j],dp[j-val[i]]+val[i]);                //printf("i=%d j=%d dp[j]=%d\n",i,j,dp[j]);            }        }        printf("%d\n",v-dp[v-5]-val[n]);    }    return 0;}
0 0