• HDU 2546 饭卡


    饭卡

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 32845    Accepted Submission(s): 11352

    Problem Description
    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
    某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
     
    Input
    多组数据。对于每组数据:
    第一行为正整数n,表示菜的数量。n<=1000。
    第二行包括n个正整数,表示每种菜的价格。价格不超过50。
    第三行包括一个正整数m,表示卡上的余额。m<=1000。

    n=0表示数据结束。
     
    Output
    对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。
     
    Sample Input
    1 50 5 10 1 2 3 2 1 1 2 3 2 1 50 0
     
    Sample Output
    -45 32
     
    Source
     
    Recommend
    lcy
    思路:和上一个题目类似。设余额为m,令s=m-5,那么我们就要找使得容量为s的背包最后剩的空间最小的方法,找到之后再用这个剩余容量+5-最大的那个没有被选的商品价值就是最小余额。但是现在我们不知道最后需要减的那个物品应该是哪个,可以证明最后需要减的那个物品一定是价值最大的那个。
      证明:假设价值最大的为max,且我们假设存在最优的情况(使余额最小)下max物品不是最后一个被减的,最后一个被减的商品价值为mid,假设此时的余额为x。那么仔细想想如果我们把max和mid的位置互换,依然可以得到余额为x.(仔细想想是不是)

           所以我们总是保留价值最大的max商品最后减。

      此题的01背包,商品的价值和体积都是Wi.

    错因:粗心把特殊情况直接输出m写成了输出5;

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,dis[1100],f[1100],maxn,mm;
    int main(){
        while(scanf("%d",&n)&&n!=0){
            maxn=0;
            memset(f,0,sizeof(f));
            memset(dis,0,sizeof(dis)); 
            for(int i=1;i<=n;i++){
                scanf("%d",&dis[i]);
                if(dis[i]>maxn){
                    maxn=dis[i];
                    mm=i;
                }
            } 
            scanf("%d",&m);
            if(m<5){
                printf("%d
    ",m);
                continue;
            }
            m-=5;
            for(int i=1;i<=n;i++){
                if(i==mm)    continue;
                for(int j=m;j>=dis[i];j--)
                    f[j]=max(f[j],f[j-dis[i]]+dis[i]);    
            }
            printf("%d
    ",5+m-f[m]-maxn);
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    解决Android SDK Manager更新、下载速度慢
    selenium报错以及各解决方法
    webdriver对各种浏览器的支持
    selenium driver版本和Chrome浏览器版本对应关系
    selenium web driver
    js中变量注意事项
    js选项卡实现
    两种JS方法实现斐波那契数列
    三种JS方法确定元素在数组中的索引值
    javascript内置属性——arguments
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7434674.html
Copyright © 2020-2023  润新知